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.

InformationsquelleAutor cazzer | 2013-09-30
Schreibe einen Kommentar