2011-03-25 44 views
2

我是SQL新手,所以这可能非常简单,但是,我无法找到解决方案。如何排除或否定两个查询?

基本上我的查询如下:

SELECT UserID 
FROM Users 

NOT UNION 

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

但是,我不知道语法是排除来自另一个查询什么。 什么,我想说的是,给我所有的用户ID的除了对于那些在X组

回答

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

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

1

NOT IN() - ()否定IN

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

中( )参数也可以是一个子查询。

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 

你可以离开加入到其他表,然后把一个已经在另一个表中的NULL检查在哪里,因为我已经证明子句。

0

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

在Postgres使用子查询 “WHERE NOT EXISTS” 可能的工作,如:

SELECT * FROM (SELECT * FROM SCHEMA_NAME.TABLE_NAME) WHERE (NOT EXISTS(SELECT * FROM SCHEMA_NAME.TABLE_NAME)

2

你可以使用EXCEPT还有:

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

EXCEPT是SQL的版本设置减法其中各种Appro公司的。疼痛(EXCEPT,NOT IN,...)你应该像往常一样依赖于你的具体情况,你的数据库支持什么,以及哪一个最适合你。

而且eugene y已经提到了你的代码中的SQL注入问题,所以我只考虑这个问题。

我链接到PostgreSQL文档,即使这不是PostgreSQL问题,因为PostgreSQL文档是相当不错的。 SQLite支持EXCEPT

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