【问题标题】:Advanced SQL Query Struggles高级 SQL 查询斗争
【发布时间】:2013-08-16 14:56:35
【问题描述】:

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

我有以下表格:

  • 事件
  • 后果
  • incident_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]

这会返回:

我需要的是:

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

干杯, 本

【问题讨论】:

  • 如果几个后果都与最高严重性有关怎么办?
  • 那不管是什么后果,我们只需要返回一个结果就说明这是事件的严重性。在 5、5、5 的情况下,我们只需要分配一个 5。

标签: sql sql-server join greatest-n-per-group


【解决方案1】:

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

不如试试类似的东西

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

【讨论】:

  • 这正是我所需要的!你是对的,我想我在 JOIN 中有点混淆了,我是如此接近哈哈。谢谢!
【解决方案2】:

使用order by severity.level desc 和TOP 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。

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

【讨论】:

  • 排序比使用 MAX 快吗?
  • 感谢您的回复,这仅适用于 1 个事件记录(其严重性最高),我需要它用于连接表中的单个唯一事件。旁观者查询就是这样工作的。非常感谢您抽出时间提供帮助,谢谢大家。
猜你喜欢
  • 2019-04-20
  • 1970-01-01
  • 2021-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-11
  • 2015-03-23
相关资源
最近更新 更多