为什么在此选择查询中未选择任何内容?

时间:2012-10-31 21:39:46

标签: sql sql-server-2008-r2

如果我跑

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
 )
 )

5 个答案:

答案 0 :(得分:5)

不,输出正确。

Company中有8441行 - 他们的CompanyID值只是您从第一个查询中获得的6个中的一个(比方说AB,{ {1}},CDE)。

所有行中有6个不同值的F值。

因此,当您在上一个查询中选择时,您希望获得所有行的值 NOT 您在第一个查询中获得的六个值中的任何一个 - 但 ALL 这些行的CompanyID确实有这6个值中的一个AF)!

所以你什么都没有回来 - 因为他们的所有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将返回零记录:

请参阅SQL Fiddle with demo

现在假设您的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)

请参阅SQL Fiddle with Demo

答案 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,它应该显示相交的值。