2017-06-18 3 views
2

Ich habe drei Tabellen:Wählen Sie Zeilen aus zwei Tabelle verbunden, die in einer dritten Tabelle nicht

Tabelle 1: (EmployeeID int, EmployeeType int)

Table2: (AllowanceID int, EmployeeType int)

Tab.3: (EmployeeID int, int AllowanceID)

01.235.

Ich brauche eine Abfrage, um verknüpfte Zeilen aus den beiden Tabellen (Tabelle1, Tabelle2) auszuwählen, die nicht in der dritten (Tabelle3) resultieren.

Ich habe versucht:

Select t1.EmployeeID, t2.AllowanceID 
From Table2 t2 Inner Join 
    Table1 t1 
    on t1.EmployeeType = t2.EmployeeType 
where Not Exists (select 1 
        From Table3 t3 
        where t3.EmployeeID = t1.EmployeeID and 
         t3.AllowanceID = t2.AllowanceID 
       ) 

aber keinen Erfolg.

enter image description here

CREATE TABLE [dbo].[Table1](
    [EmployeeID] [int] NULL, 
    [EmployeeType] [tinyint] NULL 
) ON [PRIMARY] 

CREATE TABLE [dbo].[Table2](
    [AllowanceID] [int] NOT NULL, 
    [EmployeeType] [int] NULL 
) ON [PRIMARY] 

CREATE TABLE [dbo].[Table3](
    [AllowanceID] [int] NULL, 
    [EmployeeID] [int] NULL 
) ON [PRIMARY] 


Insert into Table1 (EmployeeID,EmployeeType) 
Values 
(352395, 10), 
(352396, 16), 
(352397, 15), 
(352398, 10), 
(3523991, 16), 
(NULL, 16) 

Insert into Table2 (AllowanceID, EmployeeType) 
Values 
(100, 50), 
(30, 9), 
(32, 10), 
(37, 16), 
(512, 28), 
(6000, 10) 

Insert into Table3 (AllowanceID,EmployeeID) 
Values 
(NULL, 352400), 
(32, NULL), 
(37, NULL), 
(37, 352395), 
(6000, 352395), 
(30, 352396), 
(32, 352396), 
(37, 352396), 
(512, 352396), 
(6000, 352396), 
(30, 352397), 
(32, 352397), 
(37, 352397), 
(512, 352397), 
(6000, 352397), 
(30, 352398), 
(32, 352398), 
(37, 352398), 
(512, 352398), 
(6000, 352398), 
(30, 352399), 
(32, 352399), 
(37, 352399), 
(512, 352399), 
(6000, 352399) 
+3

Was bedeutet "kein Erfolg bedeuten"? Können Sie Beispieldaten und gewünschte Ergebnisse bereitstellen? –

+1

Ich bin die zweite Anfrage von Gordon Linoff. Als Anmerkung habe ich Ihren Post bearbeitet, um einige Zeilenumbrüche in Ihren Code einzufügen (hat nichts im Code selbst geändert). Wie es war, streckte es sich sehr weit und Benutzer mussten viel scrollen, um alles zu sehen. Nur ein Feedback für zukünftige Postformatierung. – SandPiper

+1

Der von Ihnen gepostete Code scheint mir gut zu sein, aber ohne Beispieldaten (wie DDL + DML), eine klare Problembeschreibung und gewünschte Ergebnisse ist es sehr schwierig, Ihre Frage zu beantworten. –

Antwort

1

Das Problem mit Ihrer Anfrage ist, dass es erwartet null gleich null, which is not how null works.

Um dies zu korrigieren, ändern Sie einfach t3.EmployeeID = t1.EmployeeID in (t3.EmployeeID = t1.EmployeeID or t1.EmployeeId is null).

Die Abfrage wird:

select 
    t1.EmployeeID 
    , t2.AllowanceID 
from Table2 t2 
    inner join Table1 t1 
    on t1.EmployeeType = t2.EmployeeType 
where not exists (
    select 1 
    from Table3 t3 
    where (t3.EmployeeID = t1.EmployeeID or t1.EmployeeId is null) 
    and t3.AllowanceID = t2.AllowanceID 
) 

rextester Demo: http://rextester.com/OPRHN52820

+------------+-------------+ 
| EmployeeID | AllowanceID | 
+------------+-------------+ 
|  352395 |   32 | 
| 3523991 |   37 | 
+------------+-------------+ 
+0

Perfect .. Thanks –

0

Wenn Sie SQL verwenden SERVER dann Abfrage folgende verwenden

SELECT t1.empoyeeId, t2.AllowanceId 
FROM table1 t1 
INNER JOIN table2 t2 ON t2.EmployeeTypeId = t1.EmployeeTypeID 
EXCEPT 
SELECT employeeID , allowanceID 
FROM table2 
1
SELECT t1.EmployeeID, t2.AllowanceID 
FROM Table1 t1 
JOIN Table2 t2 ON t1.EmployeeType = t2.EmployeeType 
LEFT JOIN Table3 t3 ON t3.AllowanceID = t2.AllowanceID AND t3.EmployeeID = 
t1.EmployeeID 
WHERE t3.EmployeeID IS NULL 
+0

Bitte fügen Sie einen Text hinzu, um Ihre Antwort zu erklären – EBH

0

Vielleicht könnten Sie AUSSER versuchen, die Reihenfolge der Verwendung verändert die Ergebnisse

SELECT t1.EmployeeID , t2.AllowanceID 
FROM Table2 t2 
INNER JOIN Table1 t1 ON t1.EmployeeType = t2.EmployeeType 
EXCEPT 
SELECT t3.EmployeeID , t3.AllowanceID 
FROM Table3 t3 
; 

SELECT t3.EmployeeID , t3.AllowanceID 
FROM Table3 t3 
EXCEPT 
SELECT t1.EmployeeID , t2.AllowanceID 
FROM Table2 t2 
INNER JOIN Table1 t1 ON t1.EmployeeType = t2.EmployeeType 

Gibt alle eindeutigen Werte aus der Abfrage links vom Operator EXCEPT zurück, die nicht auch von der richtigen Abfrage zurückgegeben werden. (ms docs)

1

Sie können versuchen, eine Unterabfrage mit den gewünschten Tabellen und eine linke Seite mit der Tabelle verbinden, in dem Sie den Datensatz nicht finden wollen:

Select A.EmployeeID, A.AllowanceID 
FROM (SELECT t1.EmployeeID, t2.AllowanceID 
From Table2 t2 Inner Join 
    Table1 t1 
    on t1.EmployeeType = t2.EmployeeType) A 
    LEFT JOIN t3 ON t3.EmployeeID = A.EmployeeID and 
        t3.AllowanceID = A.AllowanceID 
WHERE t3.EmployeeID IS NULL and t3.AllowanceID IS NULL 
Verwandte Themen