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;

SQL Fiddle

您也可以使用原始顺序作为 RIGHT JOIN 执行此操作,但是这可能会造成混淆,尤其是在存在其他联接的情况下。因为连接是可交换的,所以你可以交换它们。这就是为什么在实践中很少使用右连接的原因。

Note also that the grouping is over TS.TSID as T.Status may be null in some cases.