Sql 为什么在此选择查询中未选择任何内容?
如果我跑Sql 为什么在此选择查询中未选择任何内容?,sql,sql-server-2008-r2,Sql,Sql Server 2008 R2,如果我跑 Select distinct CompanyID from Device Select CompanyID from Company where CompanyID NOT IN ( Select distinct CompanyID from Device ) 我有6排。如果我跑 Select CompanyID from Company 我有8441行。如果我运行以下命令: 如果我跑 Select distinct CompanyID from Device
Select distinct CompanyID from Device
Select CompanyID
from Company where CompanyID NOT IN
(
Select distinct CompanyID from Device
)
我有6排。如果我跑
Select CompanyID from Company
我有8441行。如果我运行以下命令:
如果我跑
Select distinct CompanyID from Device
Select CompanyID
from Company where CompanyID NOT IN
(
Select distinct CompanyID from Device
)
我应该得到原始select语句中没有的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
)
)
不,输出是正确的 在Company中有8441行-它们的CompanyID值只是从第一个查询中得到的6个值之一,比如A、B、C、D、E、F 所有行都有一个来自这6个不同值的CompanyID值 因此,当您在上一次查询中选择时,您希望得到的所有行的值不是您在第一次查询中得到的六个值中的任何一个,但是所有行的CompanyId都有六个值a到F中的一个
因此,您什么也没有得到-因为他们的所有CompanyId值都存在于该子SELECT中,因此从SELECT语句中排除,所以输出是正确的 在Company中有8441行-它们的CompanyID值只是从第一个查询中得到的6个值之一,比如A、B、C、D、E、F 所有行都有一个来自这6个不同值的CompanyID值 因此,当您在上一次查询中选择时,您希望得到的所有行的值不是您在第一次查询中得到的六个值中的任何一个,但是所有行的CompanyId都有六个值a到F中的一个
因此,您什么也得不到-因为它们的所有CompanyId值都存在于该子SELECT中,因此被排除在SELECT语句之外嵌套的SELECT中有所有不同的CompanyId。因此,您将找不到该集合中不存在的任何带有CompanyID的行。嵌套select中有所有不同的CompanyID。因此,您将找不到该集中不存在的任何带有CompanyID的行。结果是正确的 如果设备表包含公司表中的所有相同值,则选择所有不同公司ID的查询将包括其他表中的所有公司ID: 例如:
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')
;
您的查询将返回以下不同的值-1、2、3、4、5、6、7。您的公司表保存这些相同的值,因此NOT IN将返回零记录:
看
现在假设您的设备表没有保存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,因为虽然它们存在于公司表中,但不在设备表中:
请参见结果是正确的
如果设备表包含公司表中的所有相同值,则选择所有不同公司ID的查询将包括其他表中的所有公司ID:
例如:
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')
;
您的查询将返回以下不同的值-1、2、3、4、5、6、7。您的公司表保存这些相同的值,因此NOT IN将返回零记录:
看
现在假设您的设备表没有保存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,因为虽然它们存在于公司表中,但不在设备表中:
请参见查询可能是正确的,但您假设数据中没有重叠 例如,如果设备表的CompanyID值为1,2,3,4,5,而公司表的CompanyID值为1,2,3,4,5,6,7,则查询结果将为0行
如果将查询从“不在”反转为“在”,则应显示相交的值。该查询可能是正确的,但您假设数据中没有重叠 例如,如果设备表的CompanyID值为1,2,3,4,5,而公司表的CompanyID值为1,2,3,4,5,6,7,则查询结果将为0行
如果将查询从“不在”反转为“在”,则应显示相交的值。假设公司中有不在设备中的公司ID,则问题在于“6从”设备中的空值。即使CompanyID不是6中的一个,NOT IN语句的计算结果也是未知的。有关更多详细信息,请参阅此Q/A: 编辑:要避免此问题,请尝试将子查询更改为:
SELECT DISTINCT CompanyID FROM Device WHERE CompanyID IS NOT NULL
假设公司中有不在设备中的CompanyID,问题是6 from设备中的空值。即使CompanyID不是6中的一个,NOT IN语句的计算结果也是未知的。有关更多详细信息,请参阅此Q/A: 编辑:要避免此问题,请尝试将子查询更改为:
SELECT DISTINCT CompanyID FROM Device WHERE CompanyID IS NOT NULL
我相信这是正确的答案。很高兴知道,我已经遇到过几次了。我刚刚添加了一个可能性
艾尔·费克斯。对不起,我刚才分心了,忘了说。我相信这是正确的答案。很高兴知道,我已经遇到过几次了。我刚刚添加了一个潜在的修复程序。对不起,我分心了,忘了早点去。