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)
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.
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
@ 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:
Dies löst alle Fälle, selbst wenn Tabelle b mehr oder andere Elemente als Tabelle a enthält
@ 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;
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;