我需要从连接表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.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,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,DATA2 from temp where rownum = 1