除非两个表之间匹配,否则我的数据不会显示
My data will not show unless there is a match between the two tables
我的问题是只有当 MainRule table 的 ID 与 Table1 table 匹配时,此查询才有效。即使 MainRule table 没有匹配的 ID,我也需要查询才能工作。即使 MainRule table.
中没有匹配的记录,表 1 中的记录也应该显示
这是我的代码:
SELECT Person, OrderNum, Name, County, SubmitDate, Days1,
SUM(Date_Diff) - 1 AS [Number of Uncleared Days]
From
(SELECT D1.RecordID AS Person, D3.[case no] AS OrderNum,
D3.FullName AS Name, D3.County, D3.[SignedDate] AS SubmitDate,
DATEDIFF(d, D3.[SignedDate], D3.closedate) AS Days1,
DATEDIFF(DAY, [HoldDate],
(SELECT TOP 1 [StatusDate]
FROM [MainRule] D2
WHERE D2.Status = 'Cleared'
AND D1.RecordID = D2.RecordID
AND D1.StatusDate < D2.StatusDate)) AS [Date_Diff]
FROM [MainRule] AS D1 INNER JOIN table1 AS D3 ON D3.ID = D1.RecordID
WHERE D1.Status = 'UnCleared') SubQ
WHERE (SubmitDate BETWEEN '10/01/2017' and '10/17/2017')
GROUP BY Person, OrderNum, Name, County, SubmitDate, Days1
只需使用 LEFT JOIN
即可:
SELECT Person, OrderNum, Name, County, SubmitDate, Days1,
SUM(Date_Diff) - 1 AS [Number of Uncleared Days]
From
(SELECT D1.RecordID AS Person, D3.[case no] AS OrderNum,
D3.FullName AS Name, D3.County, D3.[SignedDate] AS SubmitDate,
DATEDIFF(d, D3.[SignedDate], D3.closedate) AS Days1,
DATEDIFF(DAY, [HoldDate],
(SELECT TOP 1 [StatusDate]
FROM [MainRule] D2
WHERE D2.Status = 'Cleared'
AND D1.RecordID = D2.RecordID
AND D1.StatusDate < D2.StatusDate)) AS [Date_Diff]
FROM table1 AS D3
LEFT JOIN [MainRule] AS D1 ON D3.ID = D1.RecordID
WHERE D1.Status = 'UnCleared') SubQ
WHERE (SubmitDate BETWEEN '10/01/2017' and '10/17/2017')
GROUP BY Person, OrderNum, Name, County, SubmitDate, Days1
这样您将获得 MainRule
(左侧 table)中的所有行,即使其他 table table1
中没有匹配的行。
您应该详细了解联接类型之间的区别:
您有两个问题:INNER JOIN
(如其他答案所述)和 WHERE D1.Status = 'UnCleared'
。
无论您的联接是什么,WHERE
子句都会排除没有匹配 MainRule 行的行。
试试 WHERE D1.Status = 'UnCleared' OR D1.Status IS NULL
.
我的问题是只有当 MainRule table 的 ID 与 Table1 table 匹配时,此查询才有效。即使 MainRule table 没有匹配的 ID,我也需要查询才能工作。即使 MainRule table.
中没有匹配的记录,表 1 中的记录也应该显示这是我的代码:
SELECT Person, OrderNum, Name, County, SubmitDate, Days1,
SUM(Date_Diff) - 1 AS [Number of Uncleared Days]
From
(SELECT D1.RecordID AS Person, D3.[case no] AS OrderNum,
D3.FullName AS Name, D3.County, D3.[SignedDate] AS SubmitDate,
DATEDIFF(d, D3.[SignedDate], D3.closedate) AS Days1,
DATEDIFF(DAY, [HoldDate],
(SELECT TOP 1 [StatusDate]
FROM [MainRule] D2
WHERE D2.Status = 'Cleared'
AND D1.RecordID = D2.RecordID
AND D1.StatusDate < D2.StatusDate)) AS [Date_Diff]
FROM [MainRule] AS D1 INNER JOIN table1 AS D3 ON D3.ID = D1.RecordID
WHERE D1.Status = 'UnCleared') SubQ
WHERE (SubmitDate BETWEEN '10/01/2017' and '10/17/2017')
GROUP BY Person, OrderNum, Name, County, SubmitDate, Days1
只需使用 LEFT JOIN
即可:
SELECT Person, OrderNum, Name, County, SubmitDate, Days1,
SUM(Date_Diff) - 1 AS [Number of Uncleared Days]
From
(SELECT D1.RecordID AS Person, D3.[case no] AS OrderNum,
D3.FullName AS Name, D3.County, D3.[SignedDate] AS SubmitDate,
DATEDIFF(d, D3.[SignedDate], D3.closedate) AS Days1,
DATEDIFF(DAY, [HoldDate],
(SELECT TOP 1 [StatusDate]
FROM [MainRule] D2
WHERE D2.Status = 'Cleared'
AND D1.RecordID = D2.RecordID
AND D1.StatusDate < D2.StatusDate)) AS [Date_Diff]
FROM table1 AS D3
LEFT JOIN [MainRule] AS D1 ON D3.ID = D1.RecordID
WHERE D1.Status = 'UnCleared') SubQ
WHERE (SubmitDate BETWEEN '10/01/2017' and '10/17/2017')
GROUP BY Person, OrderNum, Name, County, SubmitDate, Days1
这样您将获得 MainRule
(左侧 table)中的所有行,即使其他 table table1
中没有匹配的行。
您应该详细了解联接类型之间的区别:
您有两个问题:INNER JOIN
(如其他答案所述)和 WHERE D1.Status = 'UnCleared'
。
无论您的联接是什么,WHERE
子句都会排除没有匹配 MainRule 行的行。
试试 WHERE D1.Status = 'UnCleared' OR D1.Status IS NULL
.