有条件地连接到多行

问题描述 投票:0回答:1

我有两个 SQL 表

TableA
TableB

表A:

    AgentID    SEC      CUS
    -------    ----     ------
    22441      138      41332
    53321      59       29296
    89952      282      89011
    68897      297      77654

表B:

    AgentID    SEC    STAT   NIN
    -------    ----   -----  ------
    22441      138     C     56428
    22441      138           66543
    53321      52      C     77532
    53321      59            87666       
    89952      282     C     00988
    89952      281           87776
    68897      297           11222

我需要加入

TableA
TableB
才能获取
TableA
中的所有列和
NIN
中的
TableB
列。但加入表格有一些标准。

TableA
TableB
应在
SEC
列上连接。
TableA
将有一排对应一个
AgentID
,但
TableB
可以有一个或两个。对于每个
TableA
TableB
只能连接一行
AgentID
。首先,在
TableB
中,我们应该寻找
STAT = C
并加入这一行。如果
SEC
中的
TableA
列和
TableB
STAT = C
行不匹配,那么我们应该与
TableB
中的第二行加入相同的
AgentID
。如果
TableB
没有两行
AgentID
,我们可以加入任何可用行来匹配
AgentID

例如,

AgentID
22441 在
SEC
的两行中具有匹配的
TableB
值,但
NIN
值应来自
STAT = C
行,但
AgentID
53321 没有匹配的
SEC
STAT = C
,因此
NIN
值应来自空白
STAT

我正在寻找的输出

    AgentID    SEC      CUS     NIN
    -------    ----     ------  ------
    22441      138      41332   56428
    53321      59       29296   87666        
    89952      282      89011   00988
    68897      297      77654   11222

如有任何帮助,我们将不胜感激。谢谢你。

sql sql-server
1个回答
0
投票

解决方案:

select A.*, B.MIN
from TableA A
join TableB B
on A.SEC = B.SEC
where B.STAT = 'C' or not exists (
    select 1
    from TableB
    where TableB.AgentID = A.AgentID and TableB.STAT = 'C'
)

说明:

  • 我们将
    TableA
    TableB
    分别加入
    A
    B
    来匹配它们
    我们选择 
  • SEC
  • 为“C”的
    TableB
    记录,或者不存在与
    STAT
    为“C”的匹配
    我们从 
  • STAT
  • A
    加载所有列
    MIN
    
        
© www.soinside.com 2019 - 2024. All rights reserved.