2017-05-25 1 views
1

J'ai une table avec 9 champs ID, F1..F8.Meilleure instruction SQL pour cette table?

Un exemple de certaines données:

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 
. 
. 
. 

Comment puis-je select * from table where F1...F8 in value (1,2,3)? Le résultat de cette requête doit avoir des enregistrements avec l'ID 1,2,5,7.

Répondre

0

Utiliser requête avec l'expression de table commune:

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

Merci beaucoup pour les réponses. – user2531567

2

Vous pouvez faire:

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); 

Je tiens à souligner qu'une table qui tente de mettre en œuvre un tableau à l'aide de la colonne indique suffixes généralement une mauvaise mise en page de données. Vous devriez envisager d'utiliser une table avec une valeur "f" par "id".

EDIT:

Si Firebird vraiment limiter les IN valeurs constantes, le code est plus bavard.

where (f1 = 1 or f2 = 1 or . . .) and 
     (f1 = 2 or f2 = 2 or . . .) and 
     (f1 = 3 or f2 = 3 or . . .) 
+0

intéressant que Firebird ont encore des colonnes de tableau (sans prise en charge au niveau SQL bien), mais ils seraient probablement retiré de FB4 –

+0

Firebird permet des constantes seulement dans IN clause –