2016-11-16 1 views
1

Ich verwende die Informix-Datenbank, wo ich 2 Tabellen artind und coord, die anderen mit einer Beziehung, key_code und cm_key_coord_codeSQL: Was ist der beste Weg, Zeilen aus einer Tabelle auszuwählen, die nicht in einer anderen Tabelle nur mit einer bestimmten ID existieren?

Tisch artind

+-----------+-------------+ 
| Field  | Type  | 
+-----------+-------------+ 
| key_code | char(8)  | 
| descr  | char(30) | 
+-----------+-------------+ 

Tisch koordinieren

der Regel alle Datensätze in der Tabelle artind auszuwählen, die nicht einen Datensatz mit gleichen Code (key_code gleich cm_key_coord_code) und cm_t_coor = 2 in Tabelle coord habe ich verwenden:

select * from artind where 
key_code not in (select cm_key_coord_code from coord 
where cm_t_coor = 2); 

Es gibt eine bessere Weg?

Antwort

3

Ihre Methode ist in Ordnung, aber nicht empfohlen. Wenn Werte cm_key_coord_codeNULL sind, werden keine Datensätze ausgewählt. So ist NOT IN definiert, aber normalerweise nicht, was beabsichtigt ist.

rate ich entweder NOT EXISTS oder LEFT JOIN:

select a.* 
from artind a 
where not exists (select 1 
        from coord c 
        where c.cm_t_coor = 2 and c.cm_key_coord_code = a.key_code 
       ); 

oder:

select a.* 
from artind a left join 
    coord c 
    on c.cm_t_coor = 2 and c.cm_key_coord_code = a.key_code 
where c.cm_key_coord_code is null; 
+0

In Tabelle coord habe ich mehrere Datensatz mit gleichen cm_key_coord_code, aber verschiedene cm_t_coor. Wie kann ich cm_key_coord_code auswählen, die nur Zeilen mit cm_t_coor! = 2 haben? – famedoro

+0

@famedoro. . . Das ist subtil anders als die Frage, die du gestellt hast. Ich würde vorschlagen, dass Sie eine andere Frage mit Beispieldaten und gewünschten Ergebnissen stellen. –

+0

Bitte schauen Sie sich http://stackoverflow.com/questions/40640610/sql-how-can-i-select-only-one-record-which-non-present-an-id an – famedoro

1

Ich glaube nicht, gibt es einen besseren Weg, als bei Ihnen. Ich kann Ihnen eine andere geben, aber letztlich wird dies wahrscheinlich zu den gleichen Operationen von der Abfrage-Engine übersetzt werden. Sie Abfrage tatsächlich könnte leistungsfähiger sein.

select artind.* from artind 
    left join coord on key_code = cm_key_coord_code and cm_t_coor = 2 
where cm_key_coord_code is null 

wenn Sie Performance-Probleme mit Ihnen habe ich schlage vor, an den Indizes auf den Tischen suchen

Verwandte Themen