2017-09-10 1 views
0

J'utilise DB2.Émission d'une instruction de sélection sur plusieurs lignes

Situation: Je veux faire une requête ne sur ma table RELATIONS à la liste toutes les sociétés qui ont une relation 1 ET RELATION 2 OU 3 attribué. Dans ma conception de base de données, une ou plusieurs entreprises peuvent avoir plusieurs relations.

Je veux faire une instruction select avec plusieurs opérateurs AND sur la même colonne (RELATION) avec SQL mais si j'exécute le code je ne reçois pas de coups.

SELECT R_ID, COMPANY_NAME from RELATION 
WHERE COMPANY_GROUP = 2245 
AND RELATION = 1 
AND RELATION in (2,3) 

Lorsque j'exécute cela, je n'obtiens aucun résultat.

Ceci est ma conception DB.

*** C'est le tableau RELATION

R_ID, RELATION, COMPANY_NAME 
121 1   Inbev 
122 6   Jupiler 
123 1   Unox 
124 2`   Unox 
125 4   Lotus 
126 1   Lu 
127 1   Felix 
128 2   Felix 
129 1   Unicoresels 
130 3   Unicoresels 
131 4   Sporkamt 

*** Voici la table ENTREPRISE

COMPANY_ID, COMPANY_NAME, COMPANY_ADDRESS, COMPANY_GROUP 
31   Jupiler  Some address  2245 
32   Unox   Some address  2245 
33   Lotus   Some address  2245 
34   Lu   Some address  2245 
35   Felix   Some address  2245 
36   Unicoresels Some address  2245 
37   Sporkampt  Some address  2245 

Ceci est le résultat que je veux obtenir avec une requête.

R_ID, COMPANY_NAME 
123 Unox 
124 Unox 
127 Felix 
128 Felix 
129 Unicoresels 
130 Unicoresels 

Comment puis-je faire cela?

+2

Une ligne qui a RELATION = 1 ne peut pas en avoir 2 ou 3 en même temps. – jarlh

Répondre

1

Une approche consiste à utiliser group by et having:

SELECT COMPANY_NAME 
FROM RELATION 
WHERE RELATION IN (1, 2, 3) 
GROUP BY COMPANY_NAME 
HAVING SUM(CASE WHEN RELATION = 1 THEN 1 ELSE 0 END) > 0 AND 
     SUM(CASE WHEN RELATION IN (2, 3) THEN 1 ELSE 0 END) > 0 ; 

Notes:

  • Si vous souhaitez filtrer par groupe d'entreprise, alors vous devez joindre à la table des entreprises.
  • Le tableau de relation devrait utiliser COMPANY_ID, pas COMPANY_NAME.

EDIT:

Si vous voulez que les lignes de la table RELATION qui correspondent, une méthode simple consiste à utiliser ce qui précède comme une sous-requête:

SELECT r.* 
FROM RELATION r 
WHERE r.COMPANY_NAME IN (SELECT r2.COMPANY_NAME 
         FROM RELATION r2 
         WHERE r2.RELATION IN (1, 2, 3) 
         GROUP BY r2.COMPANY_NAME 
         HAVING SUM(CASE WHEN r2.RELATION = 1 THEN 1 ELSE 0 END) > 0 AND 
           SUM(CASE WHEN r2.RELATION IN (2, 3) THEN 1 ELSE 0 END) > 0 
         );