2014-09-30 29 views
0

我試圖從第二個表中未找到值的列表的左連接返回結果,但我需要結果返回具體哪些值沒有找到。我認爲像下面這樣的東西會起作用,但是當然table2是空的,所以我不能從中拉出一列。SQL:在表2中使用左連接時從表2返回列爲空

select table1.pidm, column1, column2, **column3** from 
(select pidm, column1, column2 from aaa) table1 
left join 
(select pidm, column3 from bbb where **column3** in ('X','Y','Z')) table 2 
on table1.pidm=table2.pidm where **table2.pidm is null**; 

我可能忽略了另一個更簡單的方法,但我不知道它是什麼!

+0

所以你需要判斷'table2'中是否沒有與'pidm'相同的條目或'column3'中存儲了什麼? – TheConstructor 2014-09-30 15:10:13

+0

請提供您的架構,示例數據和預期結果。 – 2014-09-30 15:11:20

+0

TheConstructor,表2中會有匹配的pidms,但是我需要匹配的pidms在第3列中不包含X,Y或Z,並且需要具體瞭解哪些缺失。 – 2014-09-30 15:23:38

回答

0
select table1.pidm, x.CountX, y.CountY, z.CountZ 
from table1 
left join 
(select pidm, count(*) CountX from bbb where column3 = 'X' group by pidm) x on x.pidm = table1.pidm 
left join 
(select pidm, count(*) CountY from bbb where column3 = 'Y' group by pidm) y on y.pidm = table1.pidm 
left join 
(select pidm, count(*) CountZ from bbb where column3 = 'Z' group by pidm) x on z.pidm = table1.pidm 

這會給你所有表1中的pidm,以及相關的X,Y和Z值的計數。 如果只想馬存保機構,其中X之一,Y或Z缺失,補充一點:

where x.CountX = 0 or y.CountY = 0 or z.CountZ = 0 

(編輯「馬存保機構組」添加)

0

您的查詢將從aaa只選擇項其中bbb不包含相同的pidm(除column3不是'X','Y'或'Z'之一的行之外的任何行)。如果您需要查看哪些條目丟失,我會看到兩種一般方法。讓我們來看看他們這個數據集:

CREATE TABLE `aaa` (`pidm` BIGINT PRIMARY KEY AUTO_INCREMENT, `column1` VARCHAR(10), `column2` VARCHAR(10)); 
INSERT INTO `aaa` (`pidm`, `column1`, `column2`) 
VALUES (1, '1a', '1b'), (2, '2a', '2b'), (3, '3a', '3b'), (4, '4a', '4b'), (5, '5a', '5b'), (6, '6a', '6b'), 
    (7, '7a', '7b'), (8, '8a', '8b'); 
CREATE TABLE `bbb` (`pidm` BIGINT, `column3` VARCHAR(10)); 
INSERT INTO `bbb` (`pidm`, `column3`) 
VALUES (1, 'X'), (1, 'Y'), (1, 'Z'), (2, 'Y'), (2, 'Z'), (3, 'X'), (3, 'Z'), (4, 'Z'), (5, 'X'), (5, 'Y'), (6, 'Y'), 
    (7, 'X'); 

加入一個「表」只含有「X」,「Y」和「Z」第一

SELECT 
    table1.pidm, 
    table1.column1, 
    table1.column2, 
    temp1.column3 
FROM 
    aaa AS table1 
    JOIN (SELECT 
      'X' AS column3 
     UNION SELECT 
       'Y' 
     UNION SELECT 
       'Z') temp1 
    LEFT JOIN 
    bbb AS table2 ON table2.pidm = table1.pidm AND table2.column3 = temp1.column3 
WHERE table2.pidm IS NULL; 

這將導致12行其中結果中的column3的每個值將表示pidm,其中bbb中的行不能被找到。當然你也可以使用它作爲一個子查詢,並創建一個類似的結果接近2

計數值直接

SELECT 
    table1.pidm, 
    table1.column1, 
    table1.column2, 
    COALESCE(SUM(table2.column3 = 'X'), 0) AS X, 
    COALESCE(SUM(table2.column3 = 'Y'), 0) AS Y, 
    COALESCE(SUM(table2.column3 = 'Z'), 0) AS Z 
FROM 
    aaa AS table1 
    LEFT JOIN bbb AS table2 
    ON table2.pidm = table1.pidm 
GROUP BY table1.pidm; 

這將導致8排,每column3值的每個pidm計數附加到aaa的數據。

1

如果兩個表的表結構是完全一樣的,你可以試試這個:

select * from Table1 

except 

select * from Table2 

如果它們是不同的,你可以選擇你的SELECT子句中所需要的確切列