gpt4 book ai didi

mysql - SQL : "NOT IN" alternative for selecting rows based on values of *different* rows?

转载 作者:IT老高 更新时间:2023-10-29 00:21:05 25 4
gpt4 key购买 nike

如何创建一个 SQL 语句来返回由子查询、连接或其他东西修改的结果,并处理您试图返回的信息?

例如:

CREATE TABLE bowlers (
bowling_id int4 not null primary key auto_increment,
name text,
team text
);

某人可能错误地属于多个团队:

INSERT INTO `bowlers` (`name`, `team`) VALUES
('homer', 'pin pals'),
('moe', 'pin pals'),
('carl', 'pin pals'),
('lenny', 'pin pals'),
('homer', 'The homer team'),
('bart', 'The homer team'),
('maggie', 'The homer team'),
('lisa', 'The homer team'),
('marge', 'The homer team'),
('that weird french guy', 'The homer team');

所以 homer 不能决定他的球队,所以他在两个球队。做!

我想知道所有在场的人,the homer team 谁不在 pin pals 队。我能做的最好的是:

SELECT a.name, a.team 
FROM bowlers a where a.team = 'The homer team'
AND a.name
NOT IN (SELECT b.name FROM bowlers b WHERE b.team = 'pin pals');

导致:

+-----------------------+----------------+
| name | team |
+-----------------------+----------------+
| bart | The homer team |
| maggie | The homer team |
| lisa | The homer team |
| marge | The homer team |
| that weird french guy | The homer team |
+-----------------------+----------------+
5 rows in set (0.00 sec)

你知道的,太棒了!

性能会受到影响,因为子查询将针对查询的每个结果运行,即 B 到 A 到 D。对于几行来说很好,对于数十万行。

什么是更好的方法?我主要认为自连接可以解决问题,但我不知道该怎么做。

有没有其他方法可以做到这一点,而不使用 NOT IN( SELECT ... )

另外,这类问题的名称是什么?

最佳答案

像这样:

SELECT a.name, a.team
FROM bowlers a
LEFT OUTER JOIN bowlers b ON a.name = b.name AND b.team = 'pin pals'
WHERE a.team = 'The homer team'
AND b.name IS NULL;

你也可以这样做:

SELECT a.name, a.team
FROM bowlers a
WHERE a.team = 'The homer team'
AND NOT EXISTS (SELECT * FROM bowlers b
WHERE b.team = 'pin pals'
AND a.name = b.name
);

顺便说一下,这被称为“左反半连接”。

关于mysql - SQL : "NOT IN" alternative for selecting rows based on values of *different* rows?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1286155/

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