首页 > 解决方案 > SQLite 查询 - 过滤器名称,其中每个关联的 id 都包含在一组 id 中

问题描述

我正在尝试制定一个查询,该查询将找到我在给定的一组 id 中的所有不同Names的。LocationIDs问题是,如果LocationIDs与 distinct 关联的任何一个Name不在集合中,那么Name不应该在结果中。

假设我有下表:

ID | LocationID | ... | Name
-----------------------------
1  |  1         | ... | A
2  |  1         | ... | B
3  |  2         | ... | B

我需要一个类似于

SELECT DISTINCT Name FROM table WHERE LocationID IN (1, 2);

上面的问题是它只是检查是否LocationID是 1 或 2,这将返回以下内容:

A
B

但我需要它返回的是

B

因为 B 是唯一Name两个LocationIDs都在集合中的 (1, 2)

标签: sqlsqliteselect

解决方案


您可以尝试编写两个子查询。

  1. 得到count每个Name
  2. 看你count的情况。

然后join按数量计算它们,这意味着您需要全部匹配您的条件计数。

架构(SQLite v3.17)

CREATE TABLE T(
   ID int,
   LocationID int,
   Name varchar(5)

);

INSERT INTO T VALUES (1, 1,'A');
INSERT INTO T VALUES (2, 1,'B');
INSERT INTO T VALUES (3, 2,'B');

查询 #1

SELECT t2.Name
FROM 
(
    SELECT COUNT(DISTINCT LocationID) cnt
    FROM T
    WHERE LocationID IN (1, 2)
) t1
JOIN 
(
    SELECT COUNT(DISTINCT LocationID) cnt,Name
    FROM T
    WHERE LocationID IN (1, 2)
    GROUP BY Name
) t2 on t1.cnt = t2.cnt;

| Name |
| ---- |
| B    |

在 DB Fiddle 上查看


推荐阅读