2016-08-23 1 views
0

Ich habe 2 Tabellen wieSQL-Abfrage für IDs, die nie eine spezielle Kombination zeigen

id_a | id_b 
----------- 
01 | 011 
01 | 012 
02 | 021 
02 | 022 

und

id_b | cl | ds 
------------------ 
011 | F9.00 | G 
012 | F3.00 | G 
021 | F9.00 | P 
022 | G7.50 | G 

die Tabellen auf id_b verbunden sind. Nun möchte ich jede Id_a kennen, wo es keine Kombination von F9.00 | G gibt. In diesem Fall ist mein gewünschtes Ergebnis 02. Obwohl die Zeile 01 | 012 | F3.00 | G nicht mit der F9.00 | G-Anforderung übereinstimmt, möchte ich 01 als Ergebnis nicht haben, da die Kombination 01 |011 | F9.00 | G mit 01 als id_a vorliegt.

Ich kann mir im Moment keine einfache Abfrage vorstellen. Vielleicht haben einige von euch eine Idee.

Grüße, Søren

+1

was RDBMS? MySQL, SQL-Server sonst? und was hast du probiert? das scheint, als ob ein straight forward existiert, nicht in, oder link join wo null .. – xQbert

+0

Geben Sie das erwartete Ergebnis an (als eine Tabelle, wie die, die Sie bereits haben.) – jarlh

+0

seine in kylin, die Calcit als Queryengine verwendet. Das Ergebnis sollte nur eine Spalte mit den ID_a auf der Benutzeroberfläche sein –

Antwort

0
select id_a 
from table1 
except 
select t1.id_a 
from table1 t1 
inner join table2 t2 
on t1.id_b=t2.id_b 
where t2.c1 = F9.00 
and t2.ds = G 

Dieser Code wird die IDs greifen Sie nicht an der Unterseite möchten, alle IDs an der Spitze, und dann wird es ihnen

1

So etwas auszuschließen:

select t1.id_a 
from t1 
    join t2 on t1.id_b = t2.id_b 
where (t2.cl, t2.ds) <> ('F9.00', 'G') 
group by t1.id_a 
having count(*) = (select count(*) 
        from t1 as t3 
        where t3.id_a = t1.id_a); 

Dies erhält die Zeilen, in denen keine Kombination von 'F9.00', 'G' vorhanden ist, und nur jene, bei denen die resultierende Zeilenzahl für das ist das gleiche wie die Gesamtzeilenanzahl für diese id_a.


bearbeiten, nachdem die Plattform angegeben wurde:

Die oben ist ANSI SQL - ich weiß nicht, ob kylin unterstützt ANSI SQL. Wenn where (t2.cl, t2.ds) <> ('F9.00', 'G') nicht funktioniert, müssen Sie where t2.cl <> 'F9.00' and t2.ds <> 'G'

0

Sie verwenden können CONCAT auf Spalten c1 und ds verwenden:

SELECT DISTINCT id_a 
FROM T1 INNER JOIN T2 
ON T1.id_b = T2.id_b 
WHERE id_a NOT IN 
(SELECT id_a 
FROM T1 INNER JOIN T2 
ON T1.id_b = T2.id_b 
WHERE CONCAT(c1, ds) = 'F9.00G') 
Verwandte Themen