在一个语句中选择两个表的连接中的第一行

Osc*_*ero 9 sql db2

我只需要从连接表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)

这两个查询都会为每个名称提供一行.


Chr*_*ill 7

使用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唯一时才有效.


Bre*_*der 0

不确定这是否能解决您的问题,但您可以尝试使用 GROUP BY 子句并按名称列之一进行分组。

DB2 按教程分组