Sql 连接到具有多个匹配项的表,但仅返回指定的匹配项

Sql 连接到具有多个匹配项的表,但仅返回指定的匹配项,sql,sql-server-2008,tsql,Sql,Sql Server 2008,Tsql,我有三张桌子。 表A包含我的查询将基于的数据。它包含id1。 表B是我的连接表,它包含我关心的两列:id1和id2 表C是我的查找表,它包含id2和ReasonName。我需要列'ReasonName'和表A中的所有数据 如果我执行以下SQL操作: SELECT NAME, STARTDATE, ENDDATE, REASON, ID1 FROM TABLEA LEFT JOIN TABLEB

我有三张桌子。
表A包含我的查询将基于的数据。它包含id1。 表B是我的连接表,它包含我关心的两列:id1和id2

表C是我的查找表,它包含id2和ReasonName。我需要列'ReasonName'和表A中的所有数据

如果我执行以下SQL操作:

 SELECT NAME, 
       STARTDATE, 
       ENDDATE, 
       REASON, 
       ID1 
FROM   TABLEA 
       LEFT JOIN TABLEB 
              ON TABLEA.ID1 = TABLEB.ID1
然后,我可以再次连接到TableC,但这就是问题所在。 表C中有多个匹配项,因此我的totalrows增加。我需要避免这种情况。 有关TableC的外观,请参见图:

如果我的SQL语句现在如下所示:

 SELECT TABLEA.NAME, 
       TABLEA.STARTDATE, 
       TABLEA.ENDDATE, 
       TABLEA.REASON, 
       TABLEA.ID1, 
       TABLEC.REASONNAME 
FROM   TABLEA 
       LEFT JOIN TABLEB 
              ON TABLEA.ID1 = TABLEB.ID1 
       LEFT JOIN TABLEC 
              ON TABLEB.ID2 = TABLEC.ID2 
然后我的行数增加了大约1000行。这是因为TableA.id1很可能与TableC中的多个id2相匹配。然后,它复制不同TableC.ReasonName之外的行

在表C中有一个我关心的名字。对于这个例子,我会说它是“reasonf”

我需要的是从TableC中引入ReasonName,但仅包含reasonf的部分,其余部分我想说NULL或使用“无理由”进行合并。 我试着在语句中加入WHERE子句。请参见SQL:

 SELECT TABLEA.NAME, 
       TABLEA.STARTDATE, 
       TABLEA.ENDDATE, 
       TABLEA.REASON, 
       TABLEA.ID1, 
       TABLEC.REASONNAME 
FROM   TABLEA 
       LEFT JOIN TABLEB 
              ON TABLEA.ID1 = TABLEB.ID1 
       LEFT JOIN TABLEC 
              ON TABLEB.ID2 = TABLEC.ID2 
WHERE  TABLEC.ID2 = 'asd1f5as98a4' 
但是,它只会显示那些与“reasonf”匹配的记录,我希望它显示reasonf people并忽略其余的记录(保留为null或其他内容),因此我没有重复项,只有完整的结果集


我想我可能需要更改为右连接,或者可能需要更改WHERE,但我不能完全确定。

如果我正确理解您想要的内容

select 
    TableA.name,
    TableA.startDate,
    TableA.endDate,
    TableA.Reason,
    TableA.id1,
    TableC.ReasonName
from
TableA
left join TableB on TableA.id1 = TableB.id1
left join TableC on TableB.id2 = TableC.id2 and TableC.id2 = 'asd1f5as98a4'

将WHERE子句移动到join

select 
  TableA.name,
  TableA.startDate,
  TableA.endDate,
  TableA.Reason,
  TableA.id1,
  COALESCE(TableC.ReasonName, 'No Reason') AS FilteredReasonName
from
  TableA
left join
  TableB
    on  TableA.id1 = TableB.id1
    and TableB.id2 = 'asd1f5as98a4'
left join
  TableC
    on  TableB.id2 = TableC.id2
现在,TableB(复制源)只有在合理或完全不合理的情况下才会加入。然后,下一个联接将查找该代码的ReasonName

如果未找到任何内容,则COALESCE()将NULL替换为
“无原因”