SQL查询 - 确定谁只有一个礼品记录

时间:2015-02-12 00:39:03

标签: mysql sql sql-server

我想知道如何编写SQL脚本,以便在最初选择的一组人员中编写:

SELECT  [RECORDS].[CONSTITUENT_ID]
  ,[RECORDS].[FIRST_NAME]
  ,[RECORDS].[LAST_NAME]
  ,[DATEADDED]
  ,[DTE]
  ,[Amount]
  ,[REF]
  ,[TYPE]
 FROM [re7].[dbo].[GIFT]
 INNER JOIN [re7].[dbo].[RECORDS]
 ON GIFT.CONSTIT_ID LIKE RECORDS.ID
 WHERE ([DTE] BETWEEN '2/7/2015' AND '2/8/2015') 
 ORDER BY [DATEADDED] DESC

仅选择第一次捐赠者" (或者[re7]只有一件礼物的人。[dbo]。[礼物]。

[RECORDS]是所有成分的表格。

[GIFT]是所有录制礼物的表格。

上述Query的输出只是一个表格: CONSTITUENT_ID,FIRST_NAME,LAST_NAME,DATEADDED,DTE,金额,REF,TYPE

我非常希望看到相同的输出格式,但我希望查询只选择[re7]。[dbo]。[GIFT]中只有1个GIFT(按其记录ID)的CONSTITUENT_ID。

我为缺乏数据而道歉。我希望我能描述得更好......

2 个答案:

答案 0 :(得分:1)

SELECT  [RECORDS].[CONSTITUENT_ID]
  ,[RECORDS].[FIRST_NAME]
  ,[RECORDS].[LAST_NAME]
  ,[DATEADDED]
  ,[DTE]
  ,[Amount]
  ,[REF]
  ,[TYPE]
 FROM [re7].[dbo].[GIFT]
 INNER JOIN [re7].[dbo].[RECORDS]
 ON GIFT.CONSTIT_ID LIKE RECORDS.ID
 WHERE ([DTE] BETWEEN '2/7/2015' AND '2/8/2015')
     AND GIFT.CONSTIT_ID IN (
         SELECT CONSTIT_ID FROM re7.dbo.Gift GROUP BY CONSTIT_ID HAVING COUNT(*) = 1
     ) /* another option is to add a subquery to the query you already had */
 ORDER BY [DATEADDED] DESC

答案 1 :(得分:0)

此解决方案只选择仅进行一次捐赠的所有成员,然后加入该成员,从而限制结果集。

SELECT  
    r.[CONSTITUENT_ID]
    ,r.[FIRST_NAME]
    ,r.[LAST_NAME]
    ,[DATEADDED]
    ,[DTE]
    ,[Amount]
    ,[REF]
    ,[TYPE]
FROM 
    (select [CONSTIT_ID] from [re7].[dbo].[GIFT] group by [CONSTIT_ID] having count([CONSTIT_ID]) = 1) g1
    inner join [re7].[dbo].[GIFT] g
        on g.[CONSTIT_ID] = g1.[CONSTIT_ID]
    INNER JOIN [re7].[dbo].[RECORDS] r
        ON g.CONSTIT_ID LIKE r.RECORDS.ID
WHERE ([DTE] BETWEEN '2/7/2015' AND '2/8/2015') 
ORDER BY [DATEADDED] DESC