我有 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,但我不完全确定。