2017-10-16 1 views
0

Comment faire une recherche avec plusieurs critères dans la même colonne. T1 a les identifiants.Plusieurs critères dans la même colonne

T2:

ID T1_ID(FK) Value 
1 1  Apple 
2 1  Orange 
3 1  Kiwi 
4 2  Orange 
5 2  Kiwi 
6 3  Pear 
7 3  Berry 
8 3  Orange 
9 4  Apple 
10 5  Apple 
11 5  Apple 
12 5  Kiwi 

Sortie:

T2_ID(FK) Value 
1  Apple 
1  Orange 
1  Kiwi 

select t2.t1_id, t2.value 
from t1, t2 
where t1.id = t2.id 
and t2.value in ('Apple','Orange','Kiwi') 
group by t1.id having count(t2.value)=3 

Est-ce correct requête? N'apporte-t-il pas aussi t2_id = 5 parce que # 5 correspond à apple et kiwi bien que Apple soit en double?

+1

Comment saurions-nous si la requête est correcte? Vous avez posté des entrées (parfait!) Et du code qui apparemment ne fait pas ce que vous voulez (aussi utile). Vous n'avez pas indiqué l'exigence. Qu'est-ce que vous avez besoin de retourner? Toutes les lignes originales, uniquement pour les T1_ID qui apparaissent avec Apple, Orange et Kiwi au moins une fois? Exactement une fois? Exactement ces trois et aucun autre? TOUTES ces interprétations possibles sont cohérentes avec ce que vous avez posté. Alors: Quelle est l'exigence? – mathguy

+0

@mathguy: tout Apple, Orange et Kiwi, 3 valeurs au moins une fois. Mon problème provient de ma requête actuelle, si je fais une valeur = 3, cela ne fonctionne pas car certains enregistrements peuvent avoir des doublons, par exemple: ID = 5. – Skn

Répondre

0

Vous n'avez pas besoin de rejoindre t1 et vous avez besoin COUNT(DISTINCT column_name):

SQL Fiddle

Oracle 11g R2 schéma configuration:

CREATE TABLE t2 (ID, T1_ID, Value) AS 
SELECT 1, 1,  'Apple' FROM DUAL UNION ALL 
SELECT 2, 1,  'Orange' FROM DUAL UNION ALL 
SELECT 3, 1,  'Kiwi' FROM DUAL UNION ALL 
SELECT 4, 2,  'Orange' FROM DUAL UNION ALL 
SELECT 5, 2,  'Kiwi' FROM DUAL UNION ALL 
SELECT 6, 3,  'Pear' FROM DUAL UNION ALL 
SELECT 7, 3,  'Berry' FROM DUAL UNION ALL 
SELECT 8, 3,  'Orange' FROM DUAL UNION ALL 
SELECT 9, 4,  'Apple' FROM DUAL UNION ALL 
SELECT 10, 5,  'Apple' FROM DUAL UNION ALL 
SELECT 11, 5,  'Apple' FROM DUAL UNION ALL 
SELECT 12, 5,  'Kiwi' FROM DUAL; 

Requête 1:

select t1_id, 
     LISTAGG(value, ',') WITHIN GROUP (ORDER BY value) As "values" 
from t2 
where value in ('Apple','Orange','Kiwi') 
group by t1_id 
having count(DISTINCT value) = 3 

Results:

| T1_ID |   values | 
|-------|-------------------| 
|  1 | Apple,Kiwi,Orange | 

Requête 2:

Vous pouvez aussi le faire en utilisant les collections:

CREATE TYPE STRINGLIST IS TABLE OF VARCHAR2(10); 
/


SELECT * 
FROM (
    SELECT t1_id, 
     CAST(COLLECT(value ORDER BY value) AS STRINGLIST) AS "values" 
    FROM t2 
    GROUP BY t1_id 
) 
WHERE STRINGLIST('Apple', 'Kiwi', 'Orange') SUBMULTISET OF "values" 

Results:

| T1_ID |   values | 
|-------|-------------------| 
|  1 | Apple,Kiwi,Orange | 
+1

Quelle est cette exigence essayer de résoudre? Lorsque le PO n'affiche aucune exigence, il serait utile d'indiquer ce que vous avez supposé si vous offrez une réponse de toute façon. Par exemple: si T1_ID avait aussi une autre ligne avec ''Banana'' - cela doit-il être concaténé dans la chaîne' values'? (Pas clair du tout de l'exigence du PO, même si autrement le LISTAGG était requis.) – mathguy