SQL Join包括一个表的所有元素,即使它们与where子句不匹配

时间:2013-09-19 15:29:45

标签: sql sql-server outer-join

嗨我知道SQL,但当我遇到一个我无法在线找到解决方案的特定问题时,我正在通过连接工作。

我正在使用Microsoft SQL Server Management Studio。我有两张桌子需要加入。

工作表

Job_Matches表。

作业表和job_matches表中有10个作业的列表,其中列出了大约60个与这些作业匹配的人。所以我想在一列中列出作业和另一个人匹配的人数。 我使用了以下查询

Select
Jobs.Id , count(Job_Matches.Job_id)
From
Jobs, Job_Matches
where
Jobs.Id = Job_Matches.job_id
group by (Jobs.id);

表格匹配Jobs.ID和Job_Matches.Job_Id

它做了我想要的事情,除了它遗漏了任何没有人匹配的工作。所以我得到了7个工作列表,其中包含第二列中每个工作的匹配数。

这是有意义的,因为它唯一的匹配,其中id是相等的,如果没有人匹配作业,id不会出现在第二个表中。

所以我想知道在查询中是否有这样的说法:

if(Jobs.ID不在Job_Matches中默认为零)或沿着这些行。

感谢阅读。

2 个答案:

答案 0 :(得分:1)

如果您使用Oracle

SELECT
   Jobs.Id , count(Job_Matches.Job_id)
FROM
   Jobs, Job_Matches
WHERE
   Jobs.Id = Job_Matches.job_id(+)
GROUP BY Jobs.id;

但我建议您使用ANSI syntax

SELECT
   Jobs.Id , count(Job_Matches.Job_id)
FROM
   Jobs LEFT OUTER JOIN Job_Matches ON ( Jobs.Id = Job_Matches.job_id )
GROUP BY Jobs.id;

Oracle语法很旧,它将连接与WHERE子句混合在一起 使用此语法

可能很难看到表如何与复杂查询结合使用

ANSI语法清楚地将WHERE子句与连接分开。 Oracle 10G支持ANSI语法。我不知道以前的版本。

答案 1 :(得分:0)

Select
Jobs.Id , count(Job_Matches.Job_id)
From 
Jobs LEFT JOIN Job_Matches on
Jobs.Id = Job_Matches.job_id
group by (Jobs.id);