4

我有 3 张桌子。
表 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 中有多个匹配项,因此我的总行数增加了。我需要避免这种情况。请参阅图片了解 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 之外的行。

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

我需要的是通过 TableC 中的 ReasonName,但只有那些包含 reasonf 的,其余的我想说 NULL 或用“No Reason”进行 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,但我不完全确定。

4

2 回答 2

8

将您的 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() 将 NULL 替换为'No Reason'.

于 2012-10-16T13:46:03.960 回答
1

如果我正确理解你想要什么......

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'
于 2012-10-16T13:45:13.867 回答