it-swarm.com.de

SQL: Wie benutze ich UNION und ordne nach einem bestimmten select?

Ich habe zwei Auswahlmöglichkeiten:

SELECT id FROM a -- returns 1,4,2,3
UNION
SELECT id FROM b -- returns 2,1

Ich erhalte die korrekte Anzahl von Zeilen, wie zum Beispiel: 1,4,2,3.

Ich möchte jedoch zuerst b Tabellenergebnisse: 2,1,4,3 oder 2,1,3,4

Wie kann ich das machen?

(Ich verwende Oracle)

21
Topera

Mit @Adrian-Tipps habe ich eine Lösung gefunden:

Ich verwende GROUP BY und COUNT . Ich habe versucht, DISTINCT mit ORDER BY zu verwenden, aber es wird eine Fehlermeldung angezeigt: "kein ausgewählter Ausdruck"

select id from 
(
    SELECT id FROM a -- returns 1,4,2,3
    UNION ALL -- changed to ALL
    SELECT id FROM b -- returns 2,1
)
GROUP BY id ORDER BY count(id);

Danke Adrian und das Blog.

5
Topera

Sie möchten das tun:

select * from 
(
    SELECT id, 2 as ordered FROM a -- returns 1,4,2,3
    UNION
    SELECT id, 1 as ordered FROM b -- returns 2,1
)
order by ordered

Update

Ich habe festgestellt, dass Sie, obwohl Sie zwei verschiedene Tabellen haben, die IDs verknüpfen. Das heißt, wenn Sie 1 in beiden Tabellen haben, erhalten Sie nur ein Vorkommen. Wenn dies das gewünschte Verhalten ist, sollten Sie sich an UNION halten. Wenn nicht, ändern Sie zu UNION ALL.

Ich stelle auch fest, dass Sie, wenn Sie zu dem von mir vorgeschlagenen Code wechseln, sowohl 1 als auch 2 (von beiden a und b) erhalten würden. In diesem Fall möchten Sie möglicherweise den vorgeschlagenen Code folgendermaßen ändern:

select distinct id from 
(
    SELECT id, 2 as ordered FROM a -- returns 1,4,2,3
    UNION
    SELECT id, 1 as ordered FROM b -- returns 2,1
)
order by ordered
28
Adrian Carneiro

@ Adriens Antwort funktioniert nicht. Es ergibt sich ein ORA-01791.

Die richtige Antwort (für die gestellte Frage) sollte lauten:

select id
from 
 (SELECT id, 2 as ordered FROM a -- returns 1,4,2,3
  UNION ALL
  SELECT id, 1 as ordered FROM b -- returns 2,1
  )
group by id
order by min(ordered)

Erläuterung:

  1. Die "UNION ALL" kombiniert die 2 Sätze. Eine "UNION" ist umsonst, weil die 2 Sätze nicht gleich sein könnten, weil das geordnete Feld unterschiedlich ist.
  2. Das "Gruppieren nach" entfernt dann Duplikate
  3. Die "order by min (order)" stellt sicher, dass die Elemente der Tabelle b an erster Stelle stehen

Dies löst alle Fälle, selbst wenn Tabelle b mehr oder andere Elemente als Tabelle a enthält

3
rvheddeg

@ Adrian Antwort ist perfekt geeignet, ich wollte nur einen anderen Weg zum gleichen Ergebnis teilen:

select nvl(a.id, b.id)
from a full outer join b on a.id = b.id
order by b.id;
1
Allan
SELECT id, 1 AS sort_order
  FROM b
UNION
SELECT id, 2 AS sort_order
  FROM a
MINUS
SELECT id, 2 AS sort_order
  FROM b
ORDER BY 2;
0
onedaywhen