首页 > 解决方案 > 即使右连接表中没有引用,也完全获取左表数据

问题描述

使用的数据库:SQL Server

我有三张桌子A,B,C。

表A:

------------------
| ID    |  Name  |
------------------
| 1     |   X    |
------------------
| 2     |   Y    |
------------------

表 B:

----------------------
|  ID   |  Date      | 
----------------------
|  1    | 2019-11-06 |
----------------------
|  2    | 2019-11-05 |
----------------------

表 C:

----------------------------------
| ID    | B.ID  | A.ID  | Amount |
----------------------------------
| 1     |  1    |  1    | 500    |
----------------------------------
| 2     |  2    |  2    | 1000   |
----------------------------------

我想得到的结果是表 A.Name 的所有条目及其在表 C.amount 中的金额,其中表 B.Date = 2019-11-06。结果集应该包括所有 A.name 条目,即使它在表 C 中没有引用。

要求的结果是:

-----------------------
| A.Name   | C.Amount |
-----------------------
| X        |   500    |
-----------------------
| Y        |   NULL   |
-----------------------

我试过的代码:

SELECT A.Name,C.Amount
FROM A 
LEFT OUTER JOIN C ON C.A_ID=A.ID
LEFT OUTER JOIN B ON B.ID = C.B_ID ON 
WHERE B.Date='2019-11-06'

我用上面的代码得到的结果是:

------------------
| Name  | Amount |
------------------
| X     |  500   |
------------------

结果中没有 Y,这是因为在该特定日期没有 Y 条目。我只想将 Y 和数量显示为空或零。

SQL Fiddle 与我的查询

请帮我解决一下这个。

标签: sqlsql-serverleft-join

解决方案


您的 之间没有关系A and B,因此我们需要在进行左连接之前B and C使用 asubquery进行分组过滤。date

SELECT A.Name, t1.Amount
FROM A 
LEFT JOIN
  (SELECT C.A_ID, C.Amount FROM C 
    INNER JOIN B ON B.ID = C.B_ID 
    WHERE B.Date='2019-11-06') t1
     ON t1.A_ID=A.ID

dbfiddle


推荐阅读