作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
考虑以下简化示例:
CREATE TABLE groups ( gid INTEGER PRIMARY KEY, name VARCHAR(100) );
CREATE TABLE people ( pid INTEGER PRIMARY KEY );
CREATE TABLE people_groups (
gid INTEGER NOT NULL
CONSTRAINT fk_people_groups_group
REFERENCES groups(gid),
pid INTEGER NOT NULL
CONSTRAINT fk_people_groups_person
REFERENCES people(pid),
CONSTRAINT pk_people_groups PRIMARY KEY (gid, pid)
);
INSERT INTO people (pid) VALUES (1);
INSERT INTO groups (gid, name) VALUES (1, 'One');
INSERT INTO groups (gid, name) VALUES (2, 'Two');
INSERT INTO people_groups (gid, pid) VALUES (1,1);
INSERT INTO people_groups (gid, pid) VALUES (2,1);
SELECT gid, name FROM groups WHERE gid IN (
SELECT gid FROM people_groups WHERE pid = 1
);
这个输出:
1|One2|Two
最后一个 SELECT
的正确 JOIN
是什么?
最佳答案
SELECT g.gid, g.name
FROM groups g INNER JOIN people_groups pg
ON g.gid = pg.gid
WHERE pg.pid = 1
注意:这等同于您的 IN
语句,因为您专门针对一个人进行过滤。如果你过滤多人,情况就不同了。例如,假设某个具有 pid=2
的人也在组 1 中并且您执行以下 SELECT:
SELECT g.gid, g.name
FROM groups g INNER JOIN people_groups pg
ON g.gid = pg.gid
WHERE pg.pid IN (1, 2)
这会返回组 1 两次(与您的 IN
解决方案相反,后者只会返回每个组一次)。为了解决这个问题,你需要在SELECT
之后添加DISTINCT
关键字或者添加GROUP BY g.gid, g.name
在 SQL 的最后。如果您将此答案用作将 IN
转换为 JOIN
的一般规则,则应牢记这一点。
关于sql - 如何使用 JOIN 而不是 IN 选择一个人所属的所有组的名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2297957/
我是一名优秀的程序员,十分优秀!