2011-01-11 15 views
1

Ich habe zwei Tabellen wählen:Wie verschieden/Vereinigung von zwei Tabellen

Table 1 

    id date 
    1 01-JAN-2011 
    2 01-JAN-2011  
    3 01-JAN-2011 

Table 2 

    id index 
    1  01 
    1  05 
    1  06 
    2  01 
    2  02 
    3  01 
    3  07 

Ich versuche, alle einmal id-Nummern aufzulisten, wo es keine Indexnummer 06 oder 07 in einem Eintrag für die id . In diesem Fall sollte ich zum Beispiel nur ID 2 bekommen. Tabelle 1 muss ich für die Datumssuche verwenden.

Antwort

3
SELECT DISTINCT id 
    FROM table2 t 
WHERE NOT EXISTS (SELECT NULL 
        FROM table2 
        WHERE t.id = id 
         AND index IN ('06', '07')) 
0

Nominell Tabelle 1 ist unerheblich angesichts der Bedingungen, die Sie angeben:

SELECT DISTINCT t2.id 
    FROM Table2 AS t2 
WHERE t2.id NOT IN (SELECT DISTINCT t2a.id 
         FROM Tble2 AS t2a 
         WHERE t2a.index IN('06', '07') 
        ); 

Wenn Sie jedoch nur wollen Einträge, die auch eine ID in Tabelle 1, dann entsprechen:

SELECT DISTINCT t1.id 
    FROM Table1 AS t1 
    JOIN (SELECT DISTINCT t2.id 
      FROM Table2 AS t2 
     WHERE t2.id NOT IN (SELECT DISTINCT t2a.id 
           FROM Tble2 AS t2a 
           WHERE t2a.index IN('06', '07') 
          ) 
     ) AS t3 
    ON t1.id = t3.id; 

Beachten Sie, dass ich den Index als Zeichenfolge '06', '07' codiert habe, da die führende Null unwesentlich ist, wenn der Index tatsächlich eine numerische Spalte ist. Wenn Ihre Table.Index-Spalte tatsächlich ein numerischer Typ ist, löschen Sie die Anführungszeichen und die führenden Nullen. es könnte sogar (etwas) bessere Leistung für Sie geben.

1

Es ist normalerweise besser, tatsächliche Tabellen-Definitionen/INSERT-Anweisungen zu veröffentlichen, damit die Leute ihre Lösungen gegen sie schreiben und testen können. Hier ist mein Versuch, mit Beispieltabellen unter:

select ID from T2 
except 
select ID from T2 where Indx in ('06','07') 

Dies wird in SQL Server 2008

Beispieltabellen getestet:

create table T2 (
    ID int not null, 
    Indx char(2) not null 
) 
go 
insert into T2(ID,Indx) 
select 1,'01' union all 
select 1,'05' union all 
select 1,'06' union all 
select 2,'01' union all 
select 2,'02' union all 
select 3,'01' union all 
select 3,'07' 
go