我有一個表可能包含三種不同的文件類型。如果存在文件類型A,則選擇A;否則,如果文件類型B存在並且沒有具有相同client_id的類型Cs,則選擇B,否則選擇類型C.
稍後會發生一些其他魔術,其將移除所選文件從桌子上。基於列值的條件選擇
我在Oracle 10g的SQL數據庫下表:
ID | TYPE | CLIENT_ID
########################
file1 | A | 1
file2 | B | 1
file3 | C | 1
file4 | B | 2
,併爲那些誰想要一起在家裏,sqlfidde或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);
我希望能創造根據上述標準抓取下一個文件的一個很大的討厭的查詢,如果查詢運行四次,應該導致以下順序:
#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)
這讓我最遠的嘗試是寫三個獨立的查詢每種類型:
--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'
我要檢查每一個後返回的行數,如果是0使用的下一個選擇,但所有在一個SQL語句中。
感謝您的編輯,我們的目標是隻返回一行。該表格將保持較小,因此掃描整個事件不是問題。 – cazzer
這樣做對未來的其他人有所幫助 - 甲骨文在所有智慧方面都決定違背常態,並將默認桶命名爲「其他」而不是「其他」 – killjoy