SQL连接,包括一个表的所有元素,即使不';与where子句不匹配
大家好,我知道SQL,但我在处理连接时遇到了一个具体问题,我无法在线找到解决方案 我正在使用Microsoft SQL Server Management Studio。我有两张桌子需要合并 工作台 一个作业与表匹配 在jobs表中有一个包含10个工作的列表,在job_matches表中有一个包含60个左右与这些工作匹配的人的列表。因此,我想在一列中列出这些工作,在另一列中列出与之匹配的人数。 我使用了以下查询SQL连接,包括一个表的所有元素,即使不';与where子句不匹配,sql,sql-server,outer-join,Sql,Sql Server,Outer Join,大家好,我知道SQL,但我在处理连接时遇到了一个具体问题,我无法在线找到解决方案 我正在使用Microsoft SQL Server Management Studio。我有两张桌子需要合并 工作台 一个作业与表匹配 在jobs表中有一个包含10个工作的列表,在job_matches表中有一个包含60个左右与这些工作匹配的人的列表。因此,我想在一列中列出这些工作,在另一列中列出与之匹配的人数。 我使用了以下查询 Select Jobs.Id , count(Job_Matches.Job_id)
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_匹配.Job_ID
它做了我想做的,除了它遗漏了任何没有匹配人员的工作。所以我得到了一个7个工作的列表,在第二列中列出了每个工作的匹配数量
这是有意义的,因为它的唯一匹配是id相等,如果没有匹配到作业的人,则id不会出现在第二个表中
所以我想知道在查询中是否有这样的说法:
if(Jobs.ID不在Job_中匹配默认值零)或类似的内容
谢谢你的阅读 如果您使用Oracle
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);
SELECT
Jobs.Id , count(Job_Matches.Job_id)
FROM
Jobs, Job_Matches
WHERE
Jobs.Id = Job_Matches.job_id(+)
GROUP BY Jobs.id;
但是我建议你使用
Oracle语法很旧,它将联接与WHERE
子句混合使用。使用这种语法很难看到这些表是如何与复杂的查询连接在一起的 ANSI语法将
WHERE
子句与联接明确分开。Oracle 10G支持ANSI语法。我不知道以前的版本。如果您使用Oracle
SELECT
Jobs.Id , count(Job_Matches.Job_id)
FROM
Jobs, Job_Matches
WHERE
Jobs.Id = Job_Matches.job_id(+)
GROUP BY Jobs.id;
但是我建议你使用
Oracle语法很旧,它将联接与WHERE
子句混合使用。使用这种语法很难看到这些表是如何与复杂的查询连接在一起的
ANSI语法将
WHERE
子句与联接明确分开。Oracle 10G支持ANSI语法。我不知道以前的版本。谢谢,这非常有效。好的,那么你认为我不应该费心学习Oracle语法而使用这个ANSI?@user183200不再使用(+)
操作符。Oracle建议改用ANSI联接。当您使用SQL Server时,您无论如何都不能使用它。实际上,它们都是ANSI语法,旧语法来自SQL-89(及更早版本),而新语法成为SQL-92的标准语法。考虑到我们有20年的时间来调整,现在似乎是时候停止使用旧的语法了。谢谢,这很好地工作了。好的,那么你认为我不应该费心学习Oracle语法而使用这个ANSI?@user183200不再使用(+)
操作符。Oracle建议改用ANSI联接。当您使用SQL Server时,您无论如何都不能使用它。实际上,它们都是ANSI语法,旧语法来自SQL-89(及更早版本),而新语法成为SQL-92的标准语法。考虑到我们有20年的时间来调整,似乎是时候停止使用旧的语法了。欢呼,这也起到了作用,但显然我正在学习过时的语法,所以最好重新开始。再次感谢。干杯,这也起到了作用,但显然我正在学习过时的语法,所以最好重新开始。再次感谢。