2017-05-25 1 views
1

私は9つのフィールドID、F1..F8を持つテーブルを持っています。このテーブルに最適なSQL文はありますか?

は、いくつかのデータの例:

id f1 f2 f3 f4 f5 f6 f7 f8 
1 1 2 3 0 0 0 0 0 
2 0 1 0 3 2 0 0 0 
3 4 0 5 2 1 0 0 0 
4 0 0 0 0 0 0 1 4 
5 2 0 0 0 0 1 3 0 
6 2 0 0 0 0 1 0 8 
7 2 0 0 0 0 1 0 3 
. 
. 
. 

どうすればよいselect * from table where F1...F8 in value (1,2,3)? このクエリの結果には、IDが1,2,5,7のレコードが必要です。

答えて

0

使用クエリ:

WITH t AS 
    (
    SELECT id, f1 AS f from tbl 
    UNION ALL 
    SELECT id, f2 AS f from tbl 
    UNION ALL 
    SELECT id, f3 AS f from tbl 
    UNION ALL 
    SELECT id, f4 AS f from tbl 
    UNION ALL 
    SELECT id, f5 AS f from tbl 
    UNION ALL 
    SELECT id, f6 AS f from tbl 
    UNION ALL 
    SELECT id, f7 AS f from tbl 
    UNION ALL 
    SELECT id, f8 AS f from tbl 
) 
SELECT 
    t1.id 
FROM 
    t t1 
    JOIN t t2 ON t2.id = t1.id 
    JOIN t t3 ON t3.id = t2.id 
WHERE 
    t1.f IN (1, 2, 3) 
    AND 
    t2.f IN (1, 2, 3) 
    AND 
    t3.f IN (1, 2, 3) 
    AND 
    t1.f <> t2.f 
    AND 
    t2.f <> t3.f 
+0

お返事ありがとうございました。 – user2531567

2

はあなたが行うことができます。

select t.* 
from t 
where 1 in (f1, f2, f3, f4, f5, f6, f7, f8) and 
     2 in (f1, f2, f3, f4, f5, f6, f7, f8) and 
     3 in (f1, f2, f3, f4, f5, f6, f7, f8); 

私は列の接尾辞を使用してアレイを実装しようとしたテーブルは、通常、不良データレイアウトを示していることに注意してください。 「id」ごとに1つの「f」値を持つ表を使用することを検討する必要があります。

EDIT:

Firebirdのは本当に定数にIN値を制限しない場合、コードはより冗長です。

共通テーブル式と
where (f1 = 1 or f2 = 1 or . . .) and 
     (f1 = 2 or f2 = 2 or . . .) and 
     (f1 = 3 or f2 = 3 or . . .) 
+0

興味深いFirebirdのはまだ(ただし、SQLレベルでのサポートなし)配列の列を持っていることを、彼らはおそらくFB4 –

+0

火の鳥から削除されるだろうが唯一の定数を使用することができますIN句 –

関連する問題