我只需要从连接表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
这给了我
NAME DATA1 DATA2
sameName 1 2
sameName 1 3
otherName 5 7
otherName 8 9
但每个名称我只需要检索一行
NAME DATA1 DATA2
sameName 1 2
otherName 5 7
通过将结果添加到带有标识列的临时表中,然后选择每个名称的最小ID,我能够做到这一点。
这里的问题是我需要在一个语句中执行此操作。
最佳答案
这将起作用:
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
如果要选择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
这两个查询将为每个名称给出一行。
关于sql - 在一个语句中选择两个表的联接中的第一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/774769/