SQL 服务器 - 返回的行值是否都存在于一个集合中
SQL Server - do returned row values all exist in a set
我正在处理一个存储过程,其中有一个 select 查询可以 return 多个值。我正在寻找一种方法来查看这些值是否存在于过程中声明的一组不同的静态值中。
目前看起来是这样的:
DECLARE
@MachId1 = 1,
@MachId2 = 2,
@MachId3 = 3
SELECT DISTINCT pr.Machine from POs as rpo, Records as pr WHERE BoxId = @StoredProcParam and pr.PONO = rpo.poNo
-- I need to see if all the rows returned from the select query exist as a subset of {1, 2, 3}
还不完全确定如何执行此操作。我正在考虑使用 EXISTS,但不知道如何定义集合 {1,2,3}。也许作为 table,但这将如何影响存储过程的性能?
SQL 服务器 2008
您可以使用 WHERE
IN 子句。
SELECT DISTINCT pr.Machine from POs as rpo, Records as pr WHERE BoxId in (1,2,3) and pr.PONO = rpo.poNo
这些值也可以来自另一个 table。
SELECT firstname FROM person where id in (select person_id from company where name = ‘Google’)
您可以使用EXCEPT
来设置减去结果中的值。如果这导致空集,则结果必须是值的(可能为空的)子集。如果不是,则剩余元素不是值集的成员。要检查空集,您可以使用 NOT EXISTS
.
IF NOT EXISTS (SELECT DISTINCT
pr.machine
FROM pos rpo
INNER JOIN records pr
ON pr.pono = rpo.pono
WHERE boxid = @storedprocparam
EXCEPT
SELECT machid
FROM (SELECT @MachId1 machid
UNION
SELECT @MachId2 machid
UNION
SELECT @MachId3 machid) x)
BEGIN
PRINT 'Yes';
END
ELSE
BEGIN
PRINT 'No';
END;
我正在处理一个存储过程,其中有一个 select 查询可以 return 多个值。我正在寻找一种方法来查看这些值是否存在于过程中声明的一组不同的静态值中。
目前看起来是这样的:
DECLARE
@MachId1 = 1,
@MachId2 = 2,
@MachId3 = 3
SELECT DISTINCT pr.Machine from POs as rpo, Records as pr WHERE BoxId = @StoredProcParam and pr.PONO = rpo.poNo
-- I need to see if all the rows returned from the select query exist as a subset of {1, 2, 3}
还不完全确定如何执行此操作。我正在考虑使用 EXISTS,但不知道如何定义集合 {1,2,3}。也许作为 table,但这将如何影响存储过程的性能?
SQL 服务器 2008
您可以使用 WHERE
IN 子句。
SELECT DISTINCT pr.Machine from POs as rpo, Records as pr WHERE BoxId in (1,2,3) and pr.PONO = rpo.poNo
这些值也可以来自另一个 table。
SELECT firstname FROM person where id in (select person_id from company where name = ‘Google’)
您可以使用EXCEPT
来设置减去结果中的值。如果这导致空集,则结果必须是值的(可能为空的)子集。如果不是,则剩余元素不是值集的成员。要检查空集,您可以使用 NOT EXISTS
.
IF NOT EXISTS (SELECT DISTINCT
pr.machine
FROM pos rpo
INNER JOIN records pr
ON pr.pono = rpo.pono
WHERE boxid = @storedprocparam
EXCEPT
SELECT machid
FROM (SELECT @MachId1 machid
UNION
SELECT @MachId2 machid
UNION
SELECT @MachId3 machid) x)
BEGIN
PRINT 'Yes';
END
ELSE
BEGIN
PRINT 'No';
END;