外左连接在同一张桌子

时间:2017-05-03 12:02:09

标签: sql sql-server

我正在使用此代码对任何名称进行排序'出现在过去70天内的主要症状为“问题”。我有开放和封闭的列,所以我只对任何仍然存在的问题感兴趣。

select 
    name, LastEDT 
from 
    vw_UserView_ME_Open
where 
    received between dateadd(day, datediff(day, 0, getdate()) - 70, 0) 
                 and dateadd(day, datediff(day, 0, getdate()), 0)
    and MasterSymptom = 'Problem' 
    and closed is null
order by
    'LastEDT' asc;

我要做的是在同一个表上创建一个左外连接,以引用根据'名称'

记录的任何其他主要症状

我在同一张桌子上的连接经验非常有限(读取没有),因此我有点迷失,我无法从我在这里阅读的帖子中找到它。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

这可能会让你入门?基本上,如果你小心你的别名,自我JOIN就和任何其他JOIN一样。我的示例只是查找Master Symptom =“Problem”中具有相同名称的任何条目,然后对其进行COUNT。您可能希望对结果做一些不同的事情吗?

SELECT 
    o.name, 
    o.LastEDT,
    COUNT(r.*) AS related_problems
FROM 
    vw_UserView_ME_Open o
    LEFT JOIN vw_UserView_ME_Open r ON r.name = o.name AND r.MasterSymptom = 'Problem' 
WHERE 
    o.received BETWEEN CONVERT(DATE, DATEADD(DAY, -70, GETDATE())) AND CONVERT(DATE, GETDATE())
    AND o.MasterSymptom = 'Problem' 
    AND o.closed IS NULL
GROUP BY
    o.name, 
    o.LastEDT
ORDER BY 
    o.LastEDT;

我在同一时间“整理”了你的SQL。

请记住,因为这是LEFT JOIN,所以不能将相关表的任何条件添加到WHERE子句中,或者您实际上是将LEFT JOIN添加到INNER JOIN中。因此,如果您还想测试关闭的IS NULL,那么您可以添加:

r.closed IS NULL

到LEFT JOIN标准的末尾,但不是WHERE子句。

实际上这不是最好的例子,因为你可以在不破坏JOIN的情况下将额外的IS NULL标准添加到WHERE子句中。但是,结果可能不会像预期的那样,因为现在意味着:

  • 告诉我相关条目的NULL是关闭值的记录;
  • 还会记录根本没有相关条目的记录(因为这也会返回NULL)。