Sql 需要包含一些不在列表中的结果
我这里有一个SQL小提琴需要一些帮助 我需要返回任何组id,其中用户id在该组id中没有“组”设置。我在SQL FIDLE中的查询删除了13565,因为它在不同的组id中有“GROUP” 这一定很简单,但我就是搞不懂Sql 需要包含一些不在列表中的结果,sql,mysqli,Sql,Mysqli,我这里有一个SQL小提琴需要一些帮助 我需要返回任何组id,其中用户id在该组id中没有“组”设置。我在SQL FIDLE中的查询删除了13565,因为它在不同的组id中有“GROUP” 这一定很简单,但我就是搞不懂 CREATE table role( role_id int, role_type varchar(255), group_id int, user_id int ); INSERT INTO role VALUES(71002,'Group',1465,8301
CREATE table role(
role_id int,
role_type varchar(255),
group_id int,
user_id int
);
INSERT INTO role VALUES(71002,'Group',1465,8301);
INSERT INTO role VALUES(71000,'Training_admin',1465,7959);
INSERT INTO role VALUES(71003,'Training_admin',1465,8301);
INSERT INTO role VALUES(71001,'Training_User',1465,7959);
INSERT INTO role VALUES(71004,'Training_User',1465,8301);
INSERT INTO role VALUES(71005,'Training_User',1465,13541);
INSERT INTO role VALUES(493513,'Initial',6314,13565);
INSERT INTO role VALUES(493522,'Ongoing',6314,13565);
INSERT INTO role VALUES(493534,'Initial',3128,13565);
INSERT INTO role VALUES(493556,'Group',3128,13565);
select * from role
where user_id not in (select role.user_id
from role
where role.role_type = 'GROUP')
使用
不存在
而不是不在
中,这允许使用多个谓词:
SELECT *
FROM Role AS r
WHERE NOT EXISTS
( SELECT 1
FROM role AS r2
WHERE r2.user_id = r.user_id
AND r2.group_id = r.group_id
AND r2.role_type = 'GROUP'
);
话虽如此,您可能应该改写为:
SELECT r.*
FROM Role AS r
LEFT JOIN role AS r2
ON r2.user_id = r.user_id
AND r2.group_id = r.group_id
AND r2.role_type = 'GROUP'
WHERE r2.role_id IS NULL;
以下是您正在查找的不带子查询的查询(以获得更好的性能):
希望这能对您有所帮助。您应该将代码包含在您的question@GordonLinoff-给你…:)你不是已经问过这个问题了吗???@JoëlSalamin-是的,我问了一个问题,但结果不是正确的。谢谢你!!“选择1”对我来说是新的,我想这就是为什么我总是尝试使用NOT IN,@DrDan即使
SELECT 1
对您来说是新的,也可以使用第二个解决方案,而不使用子查询。最好尽量避免在SQL查询中使用子查询
SELECT *
FROM role R
LEFT OUTER JOIN role R2 ON R2.user_id = R.user_id
AND R2.role_type = 'GROUP'
WHERE R2.user_id IS NULL