1

したがって、基本的に私が現在抱えている問題は、SQL Server で高度な JOIN クエリを実行する方法がわからないことです。

次のテーブルがあります。

  • 事件
  • 結果
  • インシデント_結果 (結合)
  • 重大度

私のクエリは、データベースから各インシデント レコードを取得し、その重大度を決定する必要があります。これは、インシデントに関連付けられている結果 (結合テーブル、incident_consequence 内) を介して行われます。各結果レコードには、重大度の外部キーが関連付けられています。インシデントに関連するすべての結果を取得したら、severity.level の整数値が最も高い結果のみを返す必要があります。

ここでご覧になっているように、すべての関係については、incident_consequences.incident_id をincidents.id テーブルに結合し、そこから、incident_consequence.consequence_id を results.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結合ビジュアル

これは以下を返します:

私の結合クエリの結果

私が必要とするのは:

ここに画像の説明を入力

これで得られる助けに本当に感謝します!

乾杯、ベン

4

2 に答える 2

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 を削除しました。

私はあなたのエイリアスを残しましたが、それらは慣例に反して長いです.それらを短くすることで読みやすさが向上します.

于 2013-08-16T15:03:22.030 に答える