1

如果我跑

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 个结果之一为空,但这无关紧要。

谢谢!

编辑:在 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
 )
 )
4

5 回答 5

5

不,输出是正确的。

您有 8441 行Company- 它们的CompanyID值只是您从第一个查询中获得的 6 行之一(比如说A, B, C, D, E, F)。

所有行都有CompanyID来自这 6 个不同值的值。

因此,当您在最后一个查询中进行选择时,您希望获取所有行的值不是您在第一个查询中获得的这六个值中的任何一个 - 但所有行都具有这 6 个值中的一个(A通过FCompanyId

所以你什么也得不到——因为它们的所有CompanyId都存在于该子选择中,因此被排除在SELECT语句之外

于 2012-10-31T21:42:44.510 回答
2

假设 Company 中的 CompanyID 不在 Device 中,则问题是来自 Device 的 6 中的 NULL 值。即使 CompanyID 不是 6 个之一,您的 NOT IN 语句也会评估为 UNKNOWN。有关更多详细信息,请参阅此 Q/A:NOT IN 子句和 NULL 值

编辑:为避免这种情况,请尝试将您的子查询更改为:

SELECT DISTINCT CompanyID FROM  Device WHERE CompanyID IS NOT NULL
于 2012-10-31T21:50:15.583 回答
1

结果是正确的。

如果您的device表包含表中的所有相同值,company则选择所有DISTINCTCompanyID 的查询将包括其他表中的所有 CompanyID:

例子:

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

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

于 2012-10-31T21:43:01.640 回答
0

嵌套选择中有所有不同的 CompanyID。因此,您不会找到该集合中不存在的 CompanyID 的任何行。

于 2012-10-31T21:42:59.060 回答
0

查询可能是正确的,但您假设数据中没有重叠。

例如,如果 Device 表的 CompanyID 值为 1、2、3、4、5,而 Company 表的值为 1、2、3、4、5、6、7,那么您的查询将产生 0 行。

如果您将查询从 NOT IN 反转为 IN,它应该向您显示相交值。

于 2012-10-31T21:44:45.210 回答