我有两列,ColumnA和ColumnB,偶尔columnB不会填充,它应该是e。我正在寻找一个只会选择所有ColumnA是否未填充的查询。
ColumnA|ColumnB
Apples|
Apples|
Apples|Orange
这就是我的意思,但这是不正确的,因为它表示ColumnA为null,具有相同的值并且填充了ColumnB。我希望查询只返回所有columnB未填充的行。
SELECT ColumnA
FROM tblMyTable
WHERE ColumnA IN
(SELECT ColumnA
FROM tblMyTableB
WHERE ColumnB IS NULL)
答案 0 :(得分:3)
您当前的查询会给您太多结果。您要消除的是 ColumnB
值的那些:
SELECT ColumnA
FROM tblMyTable
WHERE ColumnA IN
(SELECT ColumnA
FROM tblMyTableB
WHERE ColumnB IS NULL)
AND NOT ColumnA IN
(SELECT ColumnA
FROM tblMyTableB
WHERE ColumnB IS NOT NULL)
或者,更聪明的是:
select ColumnA,COUNT(ColumnB) from tblMyTable
group by ColumnA having COUNT(ColumnB) = 0
因为COUNT(Expression)
仅计算非空表达式值
答案 1 :(得分:2)
看起来你的逻辑是倒退的:
尝试在两个地方添加NOT
并添加DISTINCT
以避免重复结果:
SELECT DISTINCT ColumnA
FROM tblMyTable
WHERE ColumnA NOT IN
(SELECT ColumnA
FROM tblMyTableB
WHERE ColumnB IS NOT NULL)
此外,如果ColumnA
可以为NULL,那么您必须从内部查询中排除这些NULL值,否则NOT IN
表达式将返回NULL
而不是True
因此不会返回任何结果:
SELECT DISTINCT ColumnA
FROM tblMyTable
WHERE ColumnA NOT IN
(SELECT ColumnA
FROM tblMyTableB
WHERE ColumnA IS NOT NULL
AND ColumnB IS NOT NULL)
答案 2 :(得分:0)
使用EXCEPT。这可以表示为
获取A列,除了该列A中的某些非空值
DECLARE @MyTable TABLE (ColumnA varchar(20) NOT NULL, ColumnB varchar(20) NULL);
INSERT @MyTable VALUES
('Apple', NULL),('Apple', NULL),('Apple', 'Orange'),
('Banana', NULL),('Banana', NULL),
('Strawberry', 'Pie'), ('Strawberry', 'Pie')
SELECT ColumnA FROM @MyTable
EXCEPT
SELECT ColumnA FROM @MyTable WHERE ColumnB IS NOT NULL