SQL:在表2中使用左连接时从表2返回列为空
问题描述:
我试图从第二个表中未找到值的列表的左连接返回结果,但我需要结果返回具体哪些值没有找到。我认为像下面这样的东西会起作用,但是当然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**;
我可能忽略了另一个更简单的方法,但我不知道它是什么!
答
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
(编辑“马存保机构组”添加)
答
您的查询将从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
的数据。
答
如果两个表的表结构是完全一样的,你可以试试这个:
select * from Table1
except
select * from Table2
如果它们是不同的,你可以选择你的SELECT子句中所需要的确切列
所以你需要判断'table2'中是否没有与'pidm'相同的条目或'column3'中存储了什么? – TheConstructor 2014-09-30 15:10:13
请提供您的架构,示例数据和预期结果。 – 2014-09-30 15:11:20
TheConstructor,表2中会有匹配的pidms,但是我需要匹配的pidms在第3列中不包含X,Y或Z,并且需要具体了解哪些缺失。 – 2014-09-30 15:23:38