SQL Server - 返回的行值是不是都存在于一个集合中

Posted

技术标签:

【中文标题】SQL Server - 返回的行值是不是都存在于一个集合中【英文标题】:SQL Server - do returned row values all exist in a setSQL Server - 返回的行值是否都存在于一个集合中 【发布时间】:2019-01-24 22:09:10 【问题描述】:

我正在处理一个存储过程,其中有一个可以返回多个值的选择查询。我正在寻找一种方法来查看这些值是否存在于过程中声明的一组不同的静态值中。

到目前为止,它看起来像这样:

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。也许作为一个表,但这将如何影响存储过程的性能?

SQL Server 2008

【问题讨论】:

我不明白你想在这里做什么。但是您确实需要开始使用 ANSI-92 样式的连接。他们已经存在超过 25 年了。 sqlblog.org/2009/10/08/bad-habits-to-kick-using-old-style-joins 请提供 - 作为问题中的文本,不是作为图片附件 - 示例数据和基于该数据的预期输出。 结果集必须等于 1, 2, 3,即查询必须准确返回 1, 2, 3 还是结果必须只是 1, 2, 3 或等于它,例如1 很好,1, 3 很好,1, 2, 3 很好,等等? @stickybit 感谢您的回复。结果集可以是 1,2,3 的子集或整个集。所以 1,3 有效,1,2,3 有效,1,4 无效。 @SeanLange 为什么?从您的链接来看,它似乎使查询更清晰,更不容易出错。它不提供任何优化。我应该能够选择自己的语法。 【参考方案1】:

您可以使用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;

【讨论】:

谢谢,我认为这个逻辑会起作用。由于联合子查询中的语法,无法运行查询。如果我能正常工作,我会跟进并接受 似乎是在不存在查询上带有右括号的东西,但不知道为什么。这对我来说似乎有效。 @Lamar:啊,子查询需要一个别名...检查编辑。【参考方案2】:

您可以使用WHERE IN 子句。

SELECT DISTINCT pr.Machine from POs as rpo, Records as pr WHERE BoxId in (1,2,3) and pr.PONO = rpo.poNo

这些值也可以来自另一个表。

SELECT firstname FROM person where id in (select person_id from company where name = ‘Google’)

【讨论】:

感谢您的回复,但我不是想查看boxId是否在集合中,而是尝试查看选择查询的结果是否在集合中。在这种情况下,pr.Machine 值集。

以上是关于SQL Server - 返回的行值是不是都存在于一个集合中的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL SERVER 2017 SSMS 中用以前保存的行值替换行值

SQL Server 中的表、行值 UDF

SQL LEFT JOIN 不重复相同的行值

如果所有记录都存在于 sql server 的另一个表中,则返回行列表

SQL Server 2008 R2:查找 column2 值存在于 column1 中的行

查询以返回在所有行中对于一列的每个不同值具有相同值的行值