繁体   English   中英

左外连接在同一张桌子上

[英]Outer Left Join on the same table

我正在使用此代码对过去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;

我要做的是在同一张表上创建一个外部左联接,以引用针对“名称”记录的所有其他主症状。

我在同一张桌子上进行联接的经历非常有限(不读),因此我有点迷茫,无法从我在这里阅读的帖子中弄清楚。

有人可以帮忙吗?

这可能会让您入门吗? 基本上,如果谨慎使用别名,则自我联接与其他联接完全相同。 我的示例只是查找名称相同的所有条目,其中Master Symptom =“ Problem”,然后对这些条目进行计数。 您可能想对结果做些不同的事情?

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)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM