SQL 加入并获取所有数据,即使主数据中不存在 table
SQL join and get all data even not exist in main table
我需要统计 header。所以我有 table A 包含交易记录,table B 包含交易状态。我想累积数据以显示 table A 基于 table B 的结果计数。但目前我仍然无法获得空数据。
我创建了一个 SQLFiddle here。
当来自 table A 的数据不存在时,我希望所有状态都显示为零。
如上图所示,TSID 为 4(完成)的状态未列为零。
我试过一些脚本
SELECT
COUNT(CASE WHEN A.Status = 0 THEN 1 END) AS Pending,
COUNT(CASE WHEN A.Status = 1 THEN 1 END) AS Assigned,
COUNT(CASE WHEN A.Status = 2 THEN 1 END) AS Started,
.
.
.
.
但我不想这样,因为在客户端,我使用循环并根据 SQL.
的结果 return 渲染显示
我已经尝试 LEFT JOIN, LEFT OUTER JOIN
但不是预期的结果。坦率地说,我不太擅长 SQL 加入部分。
当您想要连接中第二个 table 的所有记录时,即使第一个 table 中没有匹配项,您也需要 RIGHT JOIN
。我还从 ORDER BY
中删除了 MAX(T.status)
,因为它不会产生您想要的结果。
SELECT TS.TSID,TS.TSName,
COUNT(T.Status) as Total
FROM A T
RIGHT JOIN B TS
ON Status=TS.TSID
GROUP BY T.Status,
TS.TSID,TS.TSName
ORDER BY
MAX(TS.TSID) ASC;
你需要一个LEFT JOIN
,但你必须翻转表格的顺序
SELECT
TS.TSID,
TS.TSName,
COUNT(T.Status) as Total
FROM B TS
LEFT JOIN A T ON T.Status = TS.TSID
GROUP BY
TS.TSID,
TS.TSName
ORDER BY
TS.TSID ASC;
您也可以使用原始顺序作为 RIGHT JOIN
执行此操作,但是这可能会造成混淆,尤其是在存在其他联接的情况下。因为连接是可交换的,所以你可以交换它们。这就是为什么在实践中很少使用右连接的原因。
Note also that the grouping is over TS.TSID
as T.Status
may be null in some cases.
我需要统计 header。所以我有 table A 包含交易记录,table B 包含交易状态。我想累积数据以显示 table A 基于 table B 的结果计数。但目前我仍然无法获得空数据。
我创建了一个 SQLFiddle here。
当来自 table A 的数据不存在时,我希望所有状态都显示为零。
如上图所示,TSID 为 4(完成)的状态未列为零。
我试过一些脚本
SELECT
COUNT(CASE WHEN A.Status = 0 THEN 1 END) AS Pending,
COUNT(CASE WHEN A.Status = 1 THEN 1 END) AS Assigned,
COUNT(CASE WHEN A.Status = 2 THEN 1 END) AS Started,
.
.
.
.
但我不想这样,因为在客户端,我使用循环并根据 SQL.
的结果 return 渲染显示我已经尝试 LEFT JOIN, LEFT OUTER JOIN
但不是预期的结果。坦率地说,我不太擅长 SQL 加入部分。
当您想要连接中第二个 table 的所有记录时,即使第一个 table 中没有匹配项,您也需要 RIGHT JOIN
。我还从 ORDER BY
中删除了 MAX(T.status)
,因为它不会产生您想要的结果。
SELECT TS.TSID,TS.TSName,
COUNT(T.Status) as Total
FROM A T
RIGHT JOIN B TS
ON Status=TS.TSID
GROUP BY T.Status,
TS.TSID,TS.TSName
ORDER BY
MAX(TS.TSID) ASC;
你需要一个LEFT JOIN
,但你必须翻转表格的顺序
SELECT
TS.TSID,
TS.TSName,
COUNT(T.Status) as Total
FROM B TS
LEFT JOIN A T ON T.Status = TS.TSID
GROUP BY
TS.TSID,
TS.TSName
ORDER BY
TS.TSID ASC;
您也可以使用原始顺序作为 RIGHT JOIN
执行此操作,但是这可能会造成混淆,尤其是在存在其他联接的情况下。因为连接是可交换的,所以你可以交换它们。这就是为什么在实践中很少使用右连接的原因。
Note also that the grouping is over
TS.TSID
asT.Status
may be null in some cases.