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使用关系除法.
使用复合查询:
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)