1

嗨,我知道 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 默认为零) 或类似的东西。

谢谢阅读。

4

2 回答 2

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 语法

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

于 2013-09-19T15:45:27.830 回答
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);
于 2013-09-19T15:37:18.277 回答