SQL问题 - 外连接似乎无法正常工作

时间:2011-07-26 15:59:17

标签: sql-server

使用:sql server

这是我想要完成的。我有两个表,一个有70家公司(公司信息等),另外一张表记录了这些公司的事件编号。

我喜欢我的sql结果返回每个公司名称是否找到匹配项。我认为外连接会有所帮助,但看起来我的where子句阻止了这种情况发生:

我尝试了完全加入,外连接,左连接,相同的结果......

====>但是,如果我删除where子句,那么我将获得所有公司名称。

SELECT count(*) AS total_num, TS_NAME
FROM TTS_INCIDENTS RIGHT OUTER JOIN TS_COMPANIES
ON TS_COMPANIES.TS_ID=TTS_INCIDENTS.TS_COMPANYID
WHERE TS_ACTIVEINACTIVE = 0 AND (TS_INCIDENTTYPE=10 OR TS_INCIDENTTYPE=11)
GROUP BY TS_NAME
ORDER BY TS_NAME

由于 布鲁斯

3 个答案:

答案 0 :(得分:4)

即使我不知道哪个关系在你的示例中包含哪些列,我很确定你真的想要这样做:

FROM TS_COMPANIES LEFT OUTER JOIN TTS_INCIDENTS
  ON TS_COMPANIES.TS_ID = TTS_INCIDENTS.TS_COMPANYID
 AND TS_ACTIVEINACTIVE = 0 
 AND (TS_INCIDENTTYPE = 10 OR TS_INCIDENTTYPE = 11)

即。选择公司并将外部联接事件留给公司,使用事件谓词作为左外连接标准,而不是选择标准。

注意,在大多数RDBMS中,RIGHT OUTER JOIN通常会对性能造成严重影响,应尽可能避免(不记得我在哪里读过这篇文章。可能是过时的事实)。

答案 1 :(得分:0)

您需要进行更正:

  • RIGHT OUTER JOIN更改为LEFT JOIN
  • 向WHERE子句
  • 添加OR TTS_INCIDENTS.TS_COMPANYID is null

修改联接将优先考虑所有公司,而不是所有的INCIDENTS,就像现在一样。
修改WHERE子句将允许具有NO INCIDENTS的Comapnies也显示在列表中。

答案 2 :(得分:0)

如果WHERE子句针对JOIN中的外部表,它有效地使JOIN成为INNER JOIN(这实际上是一个非常常见的错误)。很难判断你的WHERE子句标准对哪个表起作用,因为你没有限定表。

但是,我的猜测是你需要让WHERE子句成为JOIN的一个条件。像这样:

SELECT 
    count(*) AS total_num, 
    TS_NAME 
FROM 
    TTS_INCIDENTS 
    LEFT OUTER JOIN TS_COMPANIES ON 
        TS_COMPANIES.TS_ID=TTS_INCIDENTS.TS_COMPANYID 
        AND TS_ACTIVEINACTIVE = 0 AND (TS_INCIDENTTYPE=10 OR TS_INCIDENTTYPE=11) 
GROUP BY 
    TS_NAME 
ORDER BY 
    TS_NAME