2013-08-16 91 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查詢正在以這種方式工作。非常感謝您花時間幫忙,謝謝。 –