所以这一直困扰我一段时间因为我觉得在MSSQL中这个查询运行得很好但是在我的新工作中我被迫使用Oracle。我在查询中有一个子选择,我想找到所有未分配给调查的人。我的查询如下:
Select distinct * From GetAllUsers, getperms
Where id not in (getperms.users) and Survey_ID = '1'
如果getperms表中有三个用户,我会在GETALLUsers表中为每个人获得三行。
我想我可以做某种加入而且这没问题,只是在我认为应该没有问题的时候真的很困扰我。
答案 0 :(得分:1)
我觉得在MSSQL中这个查询运行得很好
不会。在Oracle和MS-SQL中,IN子句需要是一个静态的项列表或一个返回一列的子查询,所以你需要这样的东西:
Select distinct *
From GetAllUsers
Where id not in (SELECT id FROM getperms.users)
and Survey_ID = '1'
请注意,我从FROM中取出了getperms
,因为它产生了交叉连接,这就是为什么你从两个表中获得每个记录组合的原因。
答案 1 :(得分:0)
如果您想从getperms
中排除GetAllUSers
个用户,则可以使用以下3种方法之一。
SELECT DISTINCT a.*
FROM GetAllUsers a
LEFT JOIN getperms b
ON a.id=b.users
WHERE b.users is null AND Survey_ID = '1'
OR
SELECT DISTINCT *
FROM GetAllUsers a
WHERE NOT EXISTS (SELECT 1
FROM getperms b
WHERE a.id=b.users)
AND Survey_ID = '1'
OR
SELECT DISTINCT *
FROM GetAllUsers
WHERE ID NOT IN (SELECT users
FROM getperms )
AND Survey_ID = '1'
答案 2 :(得分:0)
您的查询看起来很糟糕。首先,您使用的连接语法已经过时了二十多年。然后你使用NOT IN
它没有意义(你的集合只包含一个值)。然后我很难想象DISTINCT
在您的查询中有意义。或者两个表中的一个包含完全重复的记录,但不应该这样。 Survey_ID
真的是一个字符串吗?当您使用两个表时,您应该在列上使用限定符来指示它们所在的位置,例如GetAllUsers.id
。我假设Survey_ID
位于getperms
。
您正确编写的查询看起来如此:
Select *
From GetAllUsers gau
Join getperms gp On gp.Survey_ID = '1' And gp.users <> gau.id;
但是当然无论你是用这种方式还是其他方式来写它,它都完全一样。在Oracle或SQL Server中使用它没有区别。它的作用是:获取GetAllUsers和survey-1 getperms的所有组合,但匹配除外。因此,每个用户都会在结果中,每个用户几乎与每个getperms记录相结合。
你说:“我想找到所有未分配给调查的人”。那更像是:
Select *
From GetAllUsers
Where id Not In (Select users From getperms Where Survey_ID = '1');