如何排除或否定两个查询?

时间:2011-03-25 21:35:54

标签: sql sqlite

我是SQL的新手,所以这可能非常简单,但是,我无法找到解决方案。

基本上我的查询如下:

SELECT UserID
FROM Users

NOT UNION

SELECT UserID
FROM User_Groups
WHERE GroupID = '$_[0]'

但是,我不确定从另一个查询中排除一个查询的语法是什么。 我想说的是给我所有用户ID的以外的X组。

5 个答案:

答案 0 :(得分:4)

SELECT UserID FROM Users
  WHERE UserID NOT IN (SELECT UserID FROM User_Groups WHERE GroupID = ?)

P.S。不要将变量插入到查询中,因为这会导致代码中的SQL注入漏洞。改为使用占位符。

答案 1 :(得分:2)

SELECT Users.UserID
FROM Users
LEFT JOIN User_Groups ON Users.UserID = User_Groups.UserID
WHERE Users.GroupID = '$_[0]'
AND User_Groups.UserID IS NULL

你可以将join连接到另一个表,然后对你在WHERE子句中的另一个表进行IS NULL检查,如我所示。

答案 2 :(得分:2)

您也可以使用EXCEPT

SELECT UserID
FROM Users
    EXCEPT
SELECT UserID
FROM User_Groups
WHERE GroupID = '$_[0]'

EXCEPT是SQL的set减法版本。您应该使用的各种方法(EXCEPTNOT IN,...)通常取决于您的具体情况,数据库支持的内容以及哪种方法最适合您。

eugene y已经提到了你的代码的SQL注入问题,所以我只考虑覆盖。

我链接到PostgreSQL文档,即使这不是PostgreSQL问题,因为PostgreSQL文档非常好。 SQLite支持EXCEPT

  

EXCEPT运算符返回左SELECT返回的行的子集,这些行也不是由右侧SELECT返回的。在返回结果集之前,将从INTERSECT和EXCEPT运算符的结果中删除重复的行。

答案 3 :(得分:1)

NOT IN() - 否定IN()

SELECT UserID FROM User_Groups WHERE GroupID NOT IN('1','2')

IN()参数也可以是子查询。

答案 4 :(得分:0)

您是否正在寻找与postgres或mySQL数据库一起使用的解决方案? 或者您正在寻找一个简单的SQL解决方案吗?

使用postgres,带有“WHERE NOT EXISTS”的子查询可能会起作用:

SELECT * FROM (SELECT * FROM SCHEMA_NAME.TABLE_NAME) 哪里 (不是EXISTS(SELECT * FROM SCHEMA_NAME.TABLE_NAME)