Auswahl von zwei Werten aus derselben Tabelle, jedoch unter unterschiedlichen Bedingungen

8

Ich möchte einen Wert aus einer Tabelle in zwei verschiedene Spalten für verschiedene Werte aus derselben Tabelle abrufen. Verwenden Sie diese Abfrage als Beispiel (beachten Sie, dass sich die Auswahl in derselben Tabelle befindet, die als 2 verschiedene Tabellen aliasiert ist):

SELECT a.myVal, b.myVal 
FROM MyTable a, MyTable b
WHERE 
  a.otherVal = 100 AND
  b.otherVal = 200 AND
  a.id = b.id

Wenn ich eine relativ einfache Abfrage wie diese für mein Dataset ausführe, funktioniert dies - es dauert nur lange. Gibt es eine bessere / intelligentere Möglichkeit, diese Abfrage zu schreiben?

mattw
quelle

Antworten:

10

Aus Gründen der Lesbarkeit würde ich die Abfrage mit der moderneren Join-Syntax neu schreiben. Dadurch werden Ihre Join-Bedingungen klar von Ihren Filtern getrennt.

select a.myVal,
       b.myVal
  from MyTable a
  join MyTable b on b.id = a.id
where a.OtherVal = 100
  and b.Otherval = 200

Stellen Sie für die Leistung sicher, dass Sie über die richtigen Indizes verfügen. In diesem begrenzten Beispiel hätten Sie idealerweise einen Clustered-Index für ID und einen Nicht-Clustered-Index für OtherVal.

Nachdem ich mir Ihre Anfrage angesehen habe, kann ich jedoch nicht genau sagen, was Sie erreichen möchten.

Datagod
quelle
zu @datagod hinzufügen: SELECT a.column, b.column FROM table AS a, table AS b WHERE a.column=x AND b.column=ykönnte eine andere Möglichkeit sein, die Verwendung zu vermeiden JOIN(wenn dies nicht erforderlich ist).
Wolfram77
1
@ wolfram77, das ist noch ein Join.
Datum
4

Sie können Gruppierung und bedingte Aggregation wie folgt verwenden:

SELECT
  id,
  MAX(CASE OtherVal WHEN 100 THEN MyVal END) AS MyVal1,
  MAX(CASE OtherVal WHEN 200 THEN MyVal END) AS MyVal2
FROM MyTable
WHERE OtherVal IN (100, 200)
GROUP BY
  id
;
Andriy M.
quelle