gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 06:26:36 27 4
gpt4 key购买 nike

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

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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com