2017-06-18 195 views
2

我有三個表:從兩個選擇行連接表不是在第三個表

表1: (僱員INT,EmployeeType INT)

表2: (AllowanceID INT,EmployeeType INT)

表3: (僱員INT,AllowanceID INT)

我需要一個查詢來從兩個表(Table1,Table2)中選擇不在第三個表(Table3)中的連接行。

我想:

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 
       ) 

,但沒有成功。

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

什麼是 「沒有成功的意思」?你能提供樣本數據和期望的結果嗎? –

+1

我是第二個戈登·林諾夫的請求。作爲一個說明,我編輯了你的帖子,在你的代碼中添加了一些換行符(沒有改變代碼本身的任何東西)。事實上,它延伸得很遠,用戶不得不滾動瀏覽所有內容。只是一些反饋,爲未來的職位格式。 – SandPiper

+1

您發佈的代碼對我來說似乎很好,但沒有示例數據(如DDL + DML),明確的問題描述和期望的結果很難回答您的問題。 –

回答

1

與您查詢的問題是,它預計null等於null,which is not how null works

要解決該問題,只需將t3.EmployeeID = t1.EmployeeID更改爲(t3.EmployeeID = t1.EmployeeID or t1.EmployeeId is null)即可。

查詢變爲:

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演示:http://rextester.com/OPRHN52820

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

完美..謝謝 –

0

如果您使用的是SQL SERVER然後用下面的查詢

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

請添加一些文字來解釋您的答案 – EBH

0

或許你可以嘗試EXCEPT,使用序列改變的結果

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 

返回查詢中EXCEPT 運算符左側的所有不同的值,這些值也不是從正確的查詢中返回的。 (ms docs

1

您可以嘗試使用子查詢與所需的表格和一個左移,你想不來查找記錄的表連接:

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 
相關問題