我只需要从连接表A和B的查询中选择第一行.在表B上存在多个具有相同名称的记录.两个表中的任何一个都没有标识符.我无法更改方案,因为我不拥有数据库.
TABLE A
NAME
TABLE B
NAME
DATA1
DATA2
Select Distinct A.NAME,B.DATA1,B.DATA2
From A
Inner Join B on A.NAME = B.NAME
Run Code Online (Sandbox Code Playgroud)
这给了我
NAME DATA1 DATA2
sameName 1 2
sameName 1 3
otherName 5 7
otherName 8 9
Run Code Online (Sandbox Code Playgroud)
但我需要每个名称只检索一行
NAME DATA1 DATA2
sameName 1 2
otherName 5 7
Run Code Online (Sandbox Code Playgroud)
我能够通过将结果添加到带有标识列的临时表中,然后选择每个名称的最小标识来完成此操作.
这里的问题是我需要在一个语句中执行此操作.
Ras*_*dit 10
这将有效:
with temp as (
select A.NAME, B.DATA1, B.DATA2,
row_number() over (partition by A.NAME order by A.NAME) as rownum
from TABLEA A inner join TABLEB B
on A.NAME = B.NAME
)
select NAME, DATA1, DATA2 from temp where rownum = 1
Run Code Online (Sandbox Code Playgroud)
如果要选择data1的最小值并在其中选择data2,请使用以下变体:
with temp as (
select A.NAME, B.DATA1, B.DATA2,
row_number() over (partition by A.NAME order by B.DATA1, B.DATA2) as rownum
from TABLEA A inner join TABLEB B
on A.NAME = B.NAME
)
select NAME, DATA1, DATA2 from temp where rownum = 1
Run Code Online (Sandbox Code Playgroud)
这两个查询都会为每个名称提供一行.
使用GROUP BY可能会让你分道扬,,但要注意.如果您这样做:
Select A.NAME, min(B.DATA1), min(B.DATA2)
From A Inner Join B on A.NAME = B.NAME
Group by A.NAME;
Run Code Online (Sandbox Code Playgroud)
您将获得您正在寻找的结果:
NAME DATA1 DATA2
sameName 1 2
otherName 5 7
Run Code Online (Sandbox Code Playgroud)
但仅仅是因为您正在测试的数据.如果您更改数据,那么而不是:
otherName 8 9
Run Code Online (Sandbox Code Playgroud)
你有过:
otherName 8 4
Run Code Online (Sandbox Code Playgroud)
它将返回:
NAME DATA1 DATA2
sameName 1 2
otherName 5 4
Run Code Online (Sandbox Code Playgroud)
请注意,otherName不会从同一记录返回DATA1和DATA2!
更新:与其中一个数据值进行比较的自联接可能对您有所帮助,例如:
SELECT a.*, b.* FROM a,b
LEFT JOIN b b2 ON b.name = b2.name AND b.data2 < b2.data2
WHERE a.name = b.name AND b2.data2 IS NOT NULL;
Run Code Online (Sandbox Code Playgroud)
但是,这仅在DATA2中的值对每个NAME唯一时才有效.
归档时间: |
|
查看次数: |
36955 次 |
最近记录: |