2014-09-30 28 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子句中所需要的确切列