1

所以基本上我目前遇到的问题是我无法弄清楚如何在 SQL Server 中进行高级 JOIN 查询。

我有以下表格:

  • 事件
  • 结果
  • event_consequence (加入)
  • 严重性

我的查询需要从数据库中提取每个事件记录并确定其严重性,这是通过与事件关联的后果(在连接表 event_consequence 中)完成的。每个后果记录都有一个与之关联的严重性外键。一旦我得到了与事件相关的所有后果,我只需要返回具有最高严重级别整数值的那个。

因此,正如您可能在这里看到的那样,我需要将所有关系的 event_consequences.incident_id 加入到 events.id 表中,然后从那里将 event_consequence.consequence_id 加入到后果.id 中,然后将严重性加入到后果.严重性等中.

我在做这件事时遇到了很多麻烦,我希望一个非常了解 SQL 的聪明人能够帮助我解决这个查询。

这是我到目前为止所拥有的:

SELECT DISTINCT dbo.incidents.id, MAX(severities1.[level]) AS severities
FROM dbo.incidents
INNER JOIN dbo.incident_consequence
  ON dbo.incidents.id = dbo.incident_consequence.incident_id
INNER JOIN dbo.consequences
  ON dbo.incident_consequence.consequence_id = dbo.consequences.id
INNER JOIN dbo.severities AS severities1
  ON dbo.consequences.severity = severities1.id
LEFT OUTER JOIN dbo.severities AS severities2
  ON severities1.id = severities2.id AND severities1.[level] < severities2.[level]
WHERE (severities2.id IS NULL)
GROUP BY dbo.incidents.id, severities1.[level]

sql 连接可视化

这将返回:

我的加入查询的结果

我需要的是:

在此处输入图像描述

非常感谢我能得到的任何帮助!

干杯,本

4

2 回答 2

2

使用order by severity.level descandTOP 1只返回最严重的行:

SELECT TOP 1 dbo.incidents.id, severities1.[level] AS severities
FROM dbo.incidents
INNER JOIN dbo.incident_consequence
  ON dbo.incidents.id = dbo.incident_consequence.incident_id
INNER JOIN dbo.consequences
  ON dbo.incident_consequence.consequence_id = dbo.consequences.id
INNER JOIN dbo.severities AS severities1
  ON dbo.consequences.severity = severities1.id
WHERE (severities2.id IS NULL)
ORDER BY severities1.[level] DESC

我删除了不必要的 DISTINCT、JOIN、MAX() 和 GROUP BY。

我留下了你的别名,但它们非常长 - 你可以通过缩短它们来提高可读性。

于 2013-08-16T15:03:22.030 回答
2

如果我对您的理解正确,我不明白为什么您甚至需要第二次加入严重性。

而是尝试类似的东西

SELECT  DISTINCT 
    dbo.incidents.id, 
    MAX(severities1.[level]) AS severities
FROM    dbo.incidents INNER JOIN 
    dbo.incident_consequence ON dbo.incidents.id = dbo.incident_consequence.incident_id INNER JOIN 
    dbo.consequences ON dbo.incident_consequence.consequence_id = dbo.consequences.id INNER JOIN 
    dbo.severities AS severities1 ON dbo.consequences.severity = severities1.id 
GROUP BY dbo.incidents.id
于 2013-08-16T15:03:59.217 回答