我需要左连接SQL查询的帮助
我需要帮助写一个简单的程序。让我解释一下我想做什么 我有三张桌子我需要左连接SQL查询的帮助,sql,sql-server-2008,join,Sql,Sql Server 2008,Join,我需要帮助写一个简单的程序。让我解释一下我想做什么 我有三张桌子 tJobOffer 应用 应用状态 我想创建一个程序,返回一个tJobOffer列表,其中包含响应此tJobOffer的候选人数量。候选人是我表格申请状态的一个状态。此表链接到链接到tJobOffer的tApplication。申请可以是候选/接受/拒绝/忽略/ 我创建了这个查询: SELECT [T].[JobOfferId], [T].[JobOfferTitle],
SELECT
[T].[JobOfferId],
[T].[JobOfferTitle],
COUNT([A].[ApplicationId]) AS [CandidateCount]
FROM [tJobOffer] AS [T]
LEFT JOIN [tApplication] AS [A]
ON [A].[JobOfferId] = [T].[JobOfferId]
LEFT JOIN [tApplicationStatus] AS [S]
ON [S].[ApplicationStatusId] = [A].[ApplicationStatusId]
AND [S].[ApplicationStatusTechnicalName] = 'CANDIDATE'
GROUP BY
[T].[JobOfferId],
[T].[JobOfferTitle]
--[A].[ApplicationStatusId]
ORDER BY [T].[JobOfferTitle]
结果是
> 52ED7C67-21E1-49BB-A1F8-0601E6EED1EA Annonce 1 0
> F26B228D-0C81-4DA8-A287-F8F997CC1F9C Annonce 1b 0
> 9DA60B23-F113-4C7F-9707-2B90C1556D5D Announce 25 2
> 258E11A7-79C1-47B6-8C61-413AA54E2360 Announce 3 0
> DA582383-5DF4-4E1D-837C-382371BDEF57 Announce 6 2
这是不正确的,因为我只有一个候选人宣布6。如果有人把我的路线
--AND [S].[ApplicationStatusTechnicalName] = 'CANDIDATE'
在注释中,结果是相同的。我的问题似乎忽略了这一行。怎么了
编辑--
我的正确结果应该是
> 52ED7C67-21E1-49BB-A1F8-0601E6EED1EA Annonce 1 0
> F26B228D-0C81-4DA8-A287-F8F997CC1F9C Annonce 1b 0
> 9DA60B23-F113-4C7F-9707-2B90C1556D5D Announce 25 2
> 258E11A7-79C1-47B6-8C61-413AA54E2360 Announce 3 0
> DA582383-5DF4-4E1D-837C-382371BDEF57 Announce 6 1
试试这个:
SELECT
[T].[JobOfferId],
[T].[JobOfferTitle],
COUNT([A].[ApplicationId]) AS [CandidateCount]
FROM [tJobOffer] AS [T]
LEFT JOIN [tApplication] AS [A]
ON [A].[JobOfferId] = [T].[JobOfferId]
LEFT JOIN
(SELECT ApplicationStatusId FROM [tApplicationStatus]
WHERE [ApplicationStatusTechnicalName] = 'CANDIDATE') [S]
ON [S].[ApplicationStatusId] = [A].[ApplicationStatusId]
GROUP BY
[T].[JobOfferId],
[T].[JobOfferTitle]
ORDER BY [T].[JobOfferTitle]
我猜你想要这个:
SELECT
[T].[JobOfferId],
[T].[JobOfferTitle],
COUNT([A].[ApplicationId]) AS [CandidateCount]
FROM [tJobOffer] AS [T]
LEFT JOIN [tApplication] AS [A]
INNER JOIN [tApplicationStatus] AS [S]
ON [S].[ApplicationStatusId] = [A].[ApplicationStatusId]
AND [S].[ApplicationStatusTechnicalName] = 'CANDIDATE'
ON [A].[JobOfferId] = [T].[JobOfferId]
GROUP BY
[T].[JobOfferId],
[T].[JobOfferTitle]
ORDER BY [T].[JobOfferTitle] ;
您还可以先连接2个“应用程序”表,分组,然后使用JobOffer
连接派生表:
SELECT
[T].[JobOfferId],
[T].[JobOfferTitle],
COALESCE([G].[Cnt], 0) AS [CandidateCount]
FROM [tJobOffer] AS [T]
LEFT JOIN
( SELECT
[A].[JobOfferId],
COUNT(*) AS [Cnt]
FROM [tApplication] AS [A]
INNER JOIN [tApplicationStatus] AS [S]
ON [S].[ApplicationStatusId] = [A].[ApplicationStatusId]
AND [S].[ApplicationStatusTechnicalName] = 'CANDIDATE'
GROUP BY
[A].[JobOfferId]
) AS [G]
ON [G].[JobOfferId] = [T].[JobOfferId]
ORDER BY [T].[JobOfferTitle] ;
我不确定您是否在问,为什么使用第二个左连接的ON子句筛选的行仍然显示在最终结果中 如果这是你的问题,那么答案是:
基于on谓词的筛选器不是最终筛选器,即on谓词不确定该行是否显示在输出中,只确定它是否与其他表中的行匹配 另一方面,WHERE子句是final,在FROM子句之后处理,即在处理所有表运算符之后,以及(在外部联接的情况下)在生成所有外部行之后
因此,当您需要在生成外部行之后应用过滤器,并且希望过滤器是最终过滤器时,请在WHERE子句中指定谓词 根据您的要求,在必须使用内部联接之后,首先需要使用左联接 试试下面这个
SELECT
[T].[JobOfferId],
[T].[JobOfferTitle],
COUNT([A].[ApplicationId]) AS [CandidateCount]
FROM [tJobOffer] AS [T]
LEFT JOIN [tApplication] AS [A]
INNER JOIN [tApplicationStatus] AS [S]
ON [S].[ApplicationStatusId] = [A].[ApplicationStatusId]
AND [S].[ApplicationStatusTechnicalName] = 'CANDIDATE'
ON [A].[JobOfferId] = [T].[JobOfferId]
GROUP BY
[T].[JobOfferId],
[T].[JobOfferTitle]
ORDER BY [T].[JobOfferTitle] ;
如果您可以添加带有所需结果的示例记录,并回答您的问题
:D
如果您没有在任何地方使用它,为什么要以[S]的身份加入[tApplicationStatus]呢?正确。非常感谢。我不知道可以加入加入加入。