sqlite - 返回在列中具有完全相同项目的不同名称对

标签 sqlite relational-division

我想在表中找到不同的名称对,这些名称在项目列中具有完全相同的项目。例如:

CREATE TABLE t
(
    name    VARCHAR(255),
    item    VARCHAR(255)
);

INSERT INTO t VALUES("Alice", "Orange");
INSERT INTO t VALUES("Alice", "Pear");
INSERT INTO t VALUES("Alice", "Lemon");
INSERT INTO t VALUES("Bob", "Orange");
INSERT INTO t VALUES("Bob", "Pear");
INSERT INTO t VALUES("Bob", "Lemon");
INSERT INTO t VALUES("Charlie", "Pear");
INSERT INTO t VALUES("Charlie", "Lemon");

这里的答案是 Alice,Bob 因为他们拿走了完全相同的元素。

我只想用双重否定(使用 NOT EXISTS/NOT IN)来做这件事,我认为这更适合这个问题,但我无法想出任何与功能相差甚远的东西。

这有点类似于this问题 但我正在使用 SQLite,所以我不能使用 GROUP_CONCAT() 但我想知道如何使用 NOT EXISTS/NOT IN 使用关系划分来完成。

最佳答案

要获取所有名称对之间的共同项目数,您可以使用以下查询:

SELECT t1.name AS name1, t2.name AS name2, COUNT(*) AS cnt
FROM t AS t1
INNER JOIN t AS t2 ON t1.item = t2.item AND t1.name < t2.name
GROUP BY t1.name, t2.name

输出:

name1   name2       cnt
------------------------
Alice   Bob         3
Alice   Charlie     2
Bob     Charlie     2

现在您想要的只是过滤掉计数不等于 name1name2 的项数的 (name1, name2)。您可以使用带有相关子查询的 HAVING 子句来执行此操作:

SELECT t1.name AS name1, t2.name AS name2
FROM t AS t1
INNER JOIN t AS t2 ON t1.item = t2.item AND t1.name < t2.name
GROUP BY t1.name, t2.name
HAVING COUNT(*) = (SELECT COUNT(*) FROM t WHERE name = t1.name) AND 
       COUNT(*) = (SELECT COUNT(*) FROM t WHERE name = t2.name)

Demo here

关于sqlite - 返回在列中具有完全相同项目的不同名称对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33513926/

相关文章:

SQL 查询 - 两个不同列中的单列值

android - 如何在单个 Activity 中加载多个 AndroidViewModel 以访问使用 Room 从多个表返回值的 LiveData

编程语言中除以 1

mysql - 如何解决这个关系划分查询?

java - 用于 SQLite v2.X 的 sqlite-jdbc

MySQL Select ID 出现在不同的行上,一列有多个特定值

PostgreSQL 1 到 n 关系,查询行,其中 n 与输入完全匹配

ios - sqlite3_open 返回错误代码 23,即 SQLITE_AUTH

java - 如何在 Android 中更好地安排我的 SQLite 数据库类

node.js - 同步运行 Node sqlite3代码