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;