【问题标题】:SQL: How to check if all IDs in a list are in a tableSQL:如何检查列表中的所有 ID 是否都在表中
【发布时间】:2016-12-13 13:32:12
【问题描述】:

首先我很抱歉这个问题太明显了,因为我是 SQL 的新手。

所以,我有一个 ID 列表(可变,取决于用户选择的产品数量)。我想检查它们是否都在一张桌子上。如果其中之一不是,则查询的结果应该为空。如果它们都在那里,那么结果应该是这些 ID 所在的所有行。

我该怎么做?

最好的问候, 弗拉维奥

【问题讨论】:

  • 您使用的是哪个 DBMS?后格雷斯?甲骨文?
  • 编辑您的问题并用示例数据和所需结果标记问题。示例数据也很有帮助,因为它显示了您将如何使用“列表”执行查询。
  • 我正在使用 SQLite 连接 C#。
  • 列表,是C#元素吗?
  • 列表在 C# 中: var ids = string.Join(",", lst.Select(x => x.id).ToArray());然后从 SQLite 读取,我执行查询,例如:'string prod = string.Format("select * from PRODUCT where id in ({0}) order by Name", ids);'

标签: c# sql sqlite


【解决方案1】:

从列表到 ID 字段上的表执行 LEFT JOIN。如果没有记录,你会得到一个 null

您甚至可以放置一个 WHERE 子句,例如 'WHERE List.ID IS NULL' 以仅查看那些不在表中的子句

编辑:当我写这个答案时,原始海报并没有说他们使用 C#

【讨论】:

  • 列表在 C# 中: var ids = string.Join(",", lst.Select(x => x.id).ToArray());然后从 SQLite 读取,我执行查询,例如:'string prod = string.Format("select * from PRODUCT where id in ({0}) order by Name", ids);'我不知道如何才能以这种方式左加入列表。
  • 然后对数组执行 FOREACH 循环,并为每条记录执行 List.Contains(ArrayValue)。如果为真,则继续,否则将其添加到不同的列表或输出等
【解决方案2】:

未经测试:

不确定这是否是最有效的,但它似乎应该可以工作。

首先它会为您的列表生成表中的项目计数。接下来,它将 1 个结果记录交叉连接到包含整个列表的查询,以确保计数与您提供的列表中的计数相匹配,并将结果限制在您的列表中。

SELECT * 
FROM Table
CROSS JOIN (
  SELECT count(*)  cnt
  FROM table
  WHERE ID in (yourlist)) b
WHERE b.cnt = yourCount
  and ID IN (YourList)

运行两个 in 语句似乎总体上会非常慢;但我在编写 SQL 时的第一步通常是得到一些有效的东西,然后在需要时寻求提高性能。

【讨论】:

  • 在任何地方都不需要 DISTINCT?
  • 因此,如果我假设要查询的表是产品,我希望 ID 是主键,这样就不需要 distinct。但是,如果 ID 重复,则需要一个 distinct。
【解决方案3】:

将Id的列表放入表中,(可以将它们作为表变量参数传递给Stored proc),然后在stored proc中写入

假设来自 C# 的 id 列表在表变量 @idList 中

Select * from myTable 
Where id in (Select id from @idList)
   and not exists 
     (Select * from @idList
      where id Not in 
         (Select id from myTable)) 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-03
    • 2011-04-25
    • 1970-01-01
    • 2016-09-18
    • 2021-12-07
    • 1970-01-01
    • 2018-02-09
    相关资源
    最近更新 更多