【问题标题】:SQL Join which includes all elements of one table even if though don't match the where clauseSQL Join 包括一个表的所有元素,即使不匹配 where 子句
【发布时间】:2013-09-19 15:29:45
【问题描述】:

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

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

工作表

一个 Job_Matches 表。

jobs 表中有一个包含 10 个工作的列表,而在 job_matches 表中有一个包含 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 not in Job_Matches 默认为零) 或类似的东西。

感谢阅读。

【问题讨论】:

    标签: sql sql-server outer-join


    【解决方案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 语法。我不知道以前的版本。

    【讨论】:

    • 谢谢 这工作得很好。好的,所以你认为我不应该费心学习 Oracle 语法而使用这个 ANSI?
    • @user183200 不要再使用(+) 运算符。 Oracle 建议改用 ANSI JOIN。而且由于您使用的是 SQL Server,所以无论如何您都无法使用它。
    • 实际上,它们都是both ANSI 语法,旧语法来自SQL-89(及更早版本),而新语法成为SQL-92 的标准。鉴于我们已经有 20 年的时间来调整,似乎是时候停止使用旧语法了。
    【解决方案2】:
    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);
    

    【讨论】:

    • 干杯这也完成了这项工作,但显然我正在学习过时的语法,所以最好重新开始。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 2017-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多