在子查询上获取重复的行

时间:2016-10-07 21:02:08

标签: sql oracle

所以这一直困扰我一段时间因为我觉得在MSSQL中这个查询运行得很好但是在我的新工作中我被迫使用Oracle。我在查询中有一个子选择,我想找到所有未分配给调查的人。我的查询如下:

Select distinct * From GetAllUsers, getperms
    Where id not in (getperms.users) and Survey_ID = '1'

如果getperms表中有三个用户,我会在GETALLUsers表中为每个人获得三行。

我想我可以做某种加入而且这没问题,只是在我认为应该没有问题的时候真的很困扰我。

3 个答案:

答案 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');