返回在列中具有相同确切项的不同名称对

mar*_*gor 6 sqlite relational-division

我想在表中找到不同的名称对,它们在items列中具有相同的确切项.例如:

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");
Run Code Online (Sandbox Code Playgroud)

这里的答案是Alice,Bob因为他们采用完全相同的项目.

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

这有点类似于这个问题,但我使用SQLite,所以我不能使用GROUP_CONCAT(),但我想知道如何使用NOT EXISTS/NOT IN使用关系除法.

CL.*_*CL. 1

使用复合查询

SELECT t1.name, t2.name
FROM t AS t1, t AS t2
GROUP BY t1.name, t2.name
HAVING t1.name < t2.name
   AND NOT EXISTS (SELECT item FROM t WHERE name = t1.name
                   EXCEPT
                   SELECT item FROM t WHERE name = t2.name)
   AND NOT EXISTS (SELECT item FROM t WHERE name = t2.name
                   EXCEPT
                   SELECT item FROM t WHERE name = t1.name);
Run Code Online (Sandbox Code Playgroud)

使用 NOT IN 是可能的,位表达完全相同的机制,但更复杂:

SELECT t1.name, t2.name
FROM t AS t1, t AS t2
GROUP BY t1.name, t2.name
HAVING t1.name < t2.name
   AND NOT EXISTS (SELECT item
                   FROM t
                   WHERE name = t1.name
                     AND item NOT IN (SELECT item
                                      FROM t
                                      WHERE name = t2.name))
   AND NOT EXISTS (SELECT item
                   FROM t
                   WHERE name = t2.name
                     AND item NOT IN (SELECT item
                                      FROM t
                                      WHERE name = t1.name));
Run Code Online (Sandbox Code Playgroud)