如果我跑
Select distinct CompanyID from Device
我得到6行。如果我跑
Select CompanyID from Company
我得到了8441行。如果我运行以下内容:
如果我跑
Select CompanyID
from Company where CompanyID NOT IN
(
Select distinct CompanyID from Device
)
我应该让那些不在原始选择声明中的8435公司正确吗?
但是,当我运行它时,我得到0行。这是什么问题?上述6个结果中的一个是null,但这无关紧要。
谢谢!
编辑:在Marc-s的帮助下,我能够得到以下声明,这是我需要的,我还是觉得这个查询还有一个额外的步骤,有人想加入这个吗?DELETE from Company where CompanyID NOT IN
(
Select C.CompanyID
from Company C where C.CompanyID IN
(
Select distinct CompanyID from Device
)
OR CompanyID IN
(
Select distinct CustomerID from Device
)
OR CompanyID IN
(
Select distinct CompanyID from AssignedCompanies
)
)
答案 0 :(得分:5)
不,输出正确。
Company
中有8441行 - 他们的CompanyID
值只是您从第一个查询中获得的6个中的一个(比方说A
,B
,{ {1}},C
,D
,E
)。
所有行中有6个不同值的F
值。
因此,当您在上一个查询中选择时,您希望获得所有行的值 NOT 您在第一个查询中获得的六个值中的任何一个 - 但 ALL 这些行的CompanyID
确实有这6个值中的一个(A
到F
)!
所以你什么都没有回来 - 因为他们的所有CompanyId
值确实存在在该子选择中,因此被排除在CompanyId
语句之外
答案 1 :(得分:2)
假设公司中有CompanyID不在Device中,问题是来自Device的6中的NULL值。即使CompanyID不是其中之一,您的NOT IN语句也会评估为UNKNOWN。有关详细信息,请参阅此问答:NOT IN clause and NULL values
编辑:为避免这种情况,请尝试将子查询更改为:
SELECT DISTINCT CompanyID FROM Device WHERE CompanyID IS NOT NULL
答案 2 :(得分:1)
结果是正确的。
如果您的device
表格包含company
表格中的所有相同值,那么您选择所有DISTINCT
CompanyID的查询是否包含您其他表格中的所有公司ID:< / p>
示例:
CREATE TABLE device ([companyid] int);
INSERT INTO device ([companyid])
VALUES
(1),
(1),
(2),
(3),
(4),
(5),
(6),
(7),
(7)
;
CREATE TABLE company([companyid] int, [name] varchar(5));
INSERT INTO company ([companyid], [name])
VALUES
(1, 'Comp1'),
(2, 'Comp2'),
(3, 'Comp3'),
(4, 'Comp4'),
(5, 'Comp5'),
(6, 'Comp6'),
(7, 'Comp7')
;
您的查询将返回以下DISTINCT
值 - 1,2,3,4,5,6,7。您的company
表包含相同的值,因此NOT IN
将返回零记录:
现在假设您的device
表没有保存company
表的所有值,那么您将返回任何缺失的值
CREATE TABLE device([companyid] int);
INSERT INTO device([companyid])
VALUES
(1),
(1),
(2),
(3),
(4)
;
CREATE TABLE company([companyid] int, [name] varchar(5));
INSERT INTO company([companyid], [name])
VALUES
(1, 'Comp1'),
(2, 'Comp2'),
(3, 'Comp3'),
(4, 'Comp4'),
(5, 'Comp5'),
(6, 'Comp6'),
(7, 'Comp7')
;
然后此查询将返回值5,6,7,因为虽然它们存在于company
表中,但它们不在device
表中:
Select CompanyID
from Company
where CompanyID NOT IN (Select distinct CompanyID
from Device)
答案 3 :(得分:0)
嵌套选择中有所有不同的CompanyID。因此,您将找不到具有该组中不存在的CompanyID的任何行。
答案 4 :(得分:0)
查询可能是正确的,但您假设数据中没有重叠。
例如,如果Device表的CompanyID值为1,2,3,4,5,而Company表的值为1,2,3,4,5,6,7,则查询结果为0行。
如果将查询从NOT IN反转为IN,它应该显示相交的值。