我有一个可能包含三种不同文件类型的表。如果文件类型 A 存在,则选择 A,否则如果文件类型 B 存在并且没有具有相同 client_id 的类型 C,则选择 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 语句中。