sql - 加入具有多个匹配项的表,但只带回指定的匹配项

标签 sql sql-server-2008 tsql

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

表 C 是我的查找表,它包含 id2 和 ReasonName。我需要“原因名称”列和表 A 中的所有数据。

如果我执行以下 SQL:

 SELECT NAME, 
       STARTDATE, 
       ENDDATE, 
       REASON, 
       ID1 
FROM   TABLEA 
       LEFT JOIN TABLEB 
              ON TABLEA.ID1 = TABLEB.ID1

然后我可以对 TableC 进行第二次连接,但这就是问题所在。
TableC 中有多个匹配项,因此我的 totalrows 增加。我需要避免这种情况。
有关 TableC 的外观,请参见图像:

enter image description here

如果我的 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 之外的行。

在 TableC 中有一个我关心的 ReasonName。对于这个例子,我会说它是“reasonf”。

我需要的是从 TableC 中引入 ReasonName,但只有包含 reasonf 的那些,其余的我想说 NULL 或用“无原因”做一个 COALESCE。
我试过在语句中加入一个 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 的人并忽略其余的(保留为 null 或其他内容),所以我没有重复,但我的完整结果集。

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

最佳答案

将您的 WHERE 子句移动到连接中...

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(重复的源)仅在它是 ReasonF 或根本不是时才加入。然后下一个连接开始查找该代码的 ReasonName。

如果什么也没找到,COALESCE() 用 'No Reason' 替换 NULL .

关于sql - 加入具有多个匹配项的表,但只带回指定的匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12915993/

相关文章:

sql - SQL - 任何分组依据

sql - 如果没有返回数据,如何返回带有 0 的行?

sql - df.to_sql 连接问题,知道吗?

ruby-on-rails-3 - Ruby on Rails 与 Sql Server(不兼容的字符编码 : UTF-8 and ASCII-8BIT)

sql - 使用多个 WITH tablename AS (...) 语句 SQL Server

tsql - smallint 与 int 的性能对比

sql - 使用表名删除超过 12 个月的表

sql - 如何在具有相同结构的两个 MySQL 表中选择不同的行?

MySQL : WHERE IN and OR are not returning the same rows

sql-server - 当我使用可变参数而不是常量参数时,为什么我的内联表 UDF 慢得多?