0

我需要一个 SQL 2008 查询,它返回所有拥有 > 1 个用户字段记录且链接到他们的相同 USERFIELDUUID 的消费者——换句话说,所有那些拥有重复用户字段记录的消费者。

记录中的相关字段CONSUMER_USER_FIELD

CONSUMER_USER_FIELD_UUID - primary key
USERFIELD_UUID
CONSUMER_UUID

记录中的相关字段CONSUMER

CONSUMER_UUID - primary key

记录中的相关字段USER_FIELD

USERFIELD_UUID - primary key
CONSUMER_UUID
FIELD_NAME
PROMPT

我的代码可以找到所有拥有 >1 CONSUMER_USER_FIELD (CUF) 记录的消费者。我只是在“并且相同的 userfield_uuid 在这些 CUF 记录的 > 1 条上”部分遇到了麻烦。

这是我到目前为止所拥有的:

SELECT c.consumer_uuid 
FROM   consumer c 
       INNER JOIN consumer_user_field cuf 
               ON cuf.consumer_uuid = c.consumer_uuid 
WHERE  1 < (SELECT count(user_field_uuid) 
            FROM   consumer_user_field cuf2 
            WHERE  cuf2.consumer_uuid = c.consumer_uuid) 

我在正确的轨道上吗?我现在只需要一个 HAVING 子句吗?

4

1 回答 1

2
SELECT C.*
FROM
   dbo.Consumer C
WHERE
   EXISTS (
      SELECT *
      FROM dbo.Consumer_User_Field CUF
      WHERE C.Consumer_UUID = CUF.Consumer_UUID
      GROUP BY CUF.USERFIELD_UUID
      HAVING Count(*) >= 2
   )
;

PS 对于任何想抱怨你不能SELECT *GROUP BY: 你可以在一个EXISTS子句中的人。发帖前请自行尝试。:)

你也可以这样做:

SELECT C.*
FROM
   dbo.Consumer C
   INNER JOIN (
      SELECT DISTINCT CUF.Consumer_UUID
      FROM dbo.Consumer_User_Field CUF
      GROUP BY
         CUF.Consumer_UUID,
         CUF.USERFIELD_UUID
      HAVING Count(*) >= 2
   ) U ON C.Consumer_UUID = U.Consumer_UUID
;

还有一个想法:

SELECT C.*
FROM
   dbo.Consumer C
WHERE
   EXISTS (
      SELECT *
      FROM
         dbo.Consumer_User_Field CUF
      WHERE
         C.Consumer_UUID = CUF.Consumer_UUID
         AND EXISTS (
            SELECT *
            FROM dbo.Consumer_User_Field CUF2
            WHERE
               CUF.Consumer_UUID = CUF2.Consumer_UUID
               AND CUF.USERFIELD_UUID <> CUF2.USERFIELD_UUID
         )
   )
;

从逻辑的角度来看,这些是等效的查询。它们的表现可能不同——你应该尝试一下,看看哪一个效果最好。如果你这样做,你会告诉我吗?

于 2013-06-13T22:18:49.243 回答