2013-08-16 51 views
1

所以基本上我现在遇到的问题是我无法解决如何在SQL Server中执行高级JOIN查询。先进的SQL查询斗争

我有以下表格:

  • 事件
  • 后果
  • incident_consequence(加入)
  • 严重性

我的查询需要从数据库中提取每个事件记录和通过与事件相关的后果来确定其严重性(在加入中)表incident_consequence)。每个结果记录都有一个与其关联的严重性外键。一旦我发生与事件相关的所有后果,我只需要返回严重程度最高的整数值。

因此,您可能会在此处看到,我需要将incident_consequences.incident_id加入到incidents.id表中以获取所有关系,并从那里将incident_consequence.consequence_id加入impact.id,然后将严重性加入results.severity等等等等。

我在做这件事时遇到了很多麻烦,希望一个聪明的人能够很好地了解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 join visual

这将返回:

result of my join query

我需要的是:

enter image description here

非常感谢任何帮助,我可以得到这一个!

干杯, 本

+0

那么如果几个后果承担全部并列为最高的严重程度? – Jonny

+0

那么它的后果并不重要,我们只需要一个结果就可以说这是事件的严重程度。在例如5,5,5的情况下,我们只需要分配一个5。 –

回答

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 
+0

这正是我所需要的!你是对的,我想我在JOIN中有点混淆,我很亲密哈哈。谢谢! –

2

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

我留在您的别名中,但它们非常规地很长 - 您可以通过缩短它们来提高可读性。

+0

排序比使用MAX更快吗? – Richard

+0

感谢您的回复,这只适用于1个事件记录(其严重程度最高),我需要它用于连接表中的单个独特事件。 astanders查询正在以这种方式工作。非常感谢您花时间帮忙,谢谢。 –