Bedingte wählen Sie basierend auf Spalte Wert
Ich habe eine Tabelle enthalten können drei verschiedene Dateitypen. Wenn die Datei-Typ A vorhanden ist, wählen Sie Eine, sonst, wenn Datei-Typ B ist vorhanden UND es gibt keine Typ Cs mit der gleichen client_id, wählen Sie B, sonst wählen Sie einen Typ C.
Einige andere Magie später passieren wird, die entfernt die ausgewählte Datei aus der Tabelle.
Ich habe folgende Tabelle in einer Oracle 10g-SQL-Datenbank:
ID | TYPE | CLIENT_ID
########################
file1 | A | 1
file2 | B | 1
file3 | C | 1
file4 | B | 2
und für diejenigen, die zu Folgen zusammen zu Hause, sqlfidde oder sql:
create table files (
id varchar(8) primary key,
type varchar(4),
client_id number
);
insert into files values ('file1', 'A', 1);
insert into files values ('file2', 'B', 1);
insert into files values ('file3', 'C', 1);
insert into files values ('file4', 'B', 2);
Ich hoffe auf eine große böse Abfrage zu packen, die nächste Datei auf der Grundlage der oben genannten Kriterien, sollte das Ergebnis in der folgenden Reihenfolge, wenn die Abfrage ausgeführt wurde vier mal:
#1: file1, A, 1 (grab any As first)
#2: file4, B, 2 (grab any Bs who don't have any Cs with the same client_id)
#3: file3, C, 1 (grab any Cs)
#4: file2, B, 1 (same as run #2)
Ist der Versuch, der hat mich am weitesten zu schreiben, das drei separate Abfragen für jeden Typ:
--file type 'A' selector
select * from files where type = 'A'
--file type 'B' selector
select * from files where type = 'B' and client_id = (
select client_id from files group by client_id having count(*) = 1
);
--file type 'C' selector
select * from files where type = 'C'
Möchte ich überprüfen Sie die Anzahl der Zeilen zurückgegeben, nachdem jeder, und wenn es 0 ist, verwenden Sie die nächste auswählen, aber alle in einer SQL-Anweisung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnten Sie einige geschachtelte analytics, aber das sieht ein bisschen komplizierter, als es wohl sollte:
SQL Fiddle zeigt, dass sich das steigert sich bis zum endgültigen Ergebnis.
Oder vielleicht ein bisschen besser, und dieses mal nur das ziehen einer einzelnen Platte, die ich denke, ist das Ziel, innerhalb einer Schleife (?):
Aktualisierte SQL Fiddle, zeigt die Arbeit wieder auf, so dass Sie sehen können, die ausgewertet Ordnung ist das, was Sie gefragt haben.
Entweder Weg, dies trifft nur die Tabelle einmal, was ein Vorteil sein kann, aber Scannen muss, die ganze Sache, die kann nicht...
Alle diese Logik kann sein Platz in der order by-Anweisung wirklich. Dies funktioniert in SQL fiddle-Instanz (danke für die Bereitstellung, die, diese Antwort wäre nicht zusammen gekommen ohne es). Sie sind ziemlich viel Fragen für eine select * mit einem interessanten order by-Anweisung. Um dies zu tun, um durch (Ihre zweite Zustand b, wobei c nicht vorhanden) benötigen wir einen self-join zu.