私は、3つの異なるファイルタイプを含むテーブルを持っています。ファイルタイプAが存在する場合はAを選択し、ファイルタイプBが存在し、同じclient_idを持つタイプCがない場合はBを選択し、タイプCを選択する場合は
選択されたファイルテーブルから。列の値に基づく条件付き選択
私は、Oracleの10g 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);
:
ID | TYPE | CLIENT_ID
########################
file1 | A | 1
file2 | B | 1
file3 | C | 1
file4 | B | 2
と自宅で一緒にフォローしたい人のために、sqlfiddeまたはSQLを上記の基準に基づいて次のファイルを取得するための大きな不快なクエリ。クエリが4回実行された場合、次の順序で結果が返されます。
#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)
私に最も遠いを得た試みが種類ごとに3つの別々のクエリを作成することでした:
--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使用である場合は、次の選択が、すべての1つのSQLステートメントで。
おかげ全体をスキャンする必要があり、目標は1行のみを戻すことです。テーブルは小さいままなので、全体をスキャンすることは問題ではありません。 – cazzer
これは将来的に他の誰かに役立ちます - オラクルは、すべての創意工夫が標準に反することを決め、デフォルトのバケットを「それ以外のもの」ではなく「その他」としました。 – killjoy