Sql 避免select查询中的并集

Sql 避免select查询中的并集,sql,union,Sql,Union,我有下面的SQL用于报告查询,其中我必须列出给定时间范围内的所有生日和周年纪念日。有没有更好的方法来避免使用UNION和SELECT-DISTINCT? 我已经将其更改为使用UNIONALL,因为数据已经是不同的 请注意,我们可以在同一时间范围内同时拥有周年纪念日和生日 SELECT gpms.[birthdate] AS [Date], 'Birthday' AS [Event], gpms.[name]

我有下面的SQL用于报告查询,其中我必须列出给定时间范围内的所有生日和周年纪念日。有没有更好的方法来避免使用UNION和SELECT-DISTINCT? 我已经将其更改为使用UNIONALL,因为数据已经是不同的

请注意,我们可以在同一时间范围内同时拥有周年纪念日和生日

SELECT  
    gpms.[birthdate]          AS [Date],
    'Birthday'                AS [Event], 
    gpms.[name]               AS [Name], 
    gpms.[email]              AS [Email],     
    gpms.[address]            AS [Address],   
FROM PERSONDETAILS gpms
JOIN @selectedpersons sgf ON sgf.[account] = gpms.[account]
WHERE DATEADD(year,DATEDIFF(YEAR, birthdate, @p_StartDate),birthdate) BETWEEN @p_StartDate AND @p_endDate
   OR DATEADD(year,DATEDIFF(YEAR, birthdate, @p_endDate  ),birthdate) BETWEEN @p_StartDate AND @p_endDate
UNION 
SELECT 
    gpms.[birthdate]          AS [Date],
    'Birthday'                AS [Event], 
    gpms.[name]               AS [Name], 
    gpms.[email]              AS [Email],     
    gpms.[address]            AS [Address],   
FROM PERSONDETAILS gpms
JOIN @selectedpersons sgf ON sgf.[account] = gpms.[account] 
WHERE DATEADD(year,DATEDIFF(YEAR, Anniversary, @p_StartDate),Anniversary) BETWEEN @p_StartDate AND @p_endDate
   OR DATEADD(year,DATEDIFF(YEAR, Anniversary, @p_endDate  ),Anniversary) BETWEEN @p_StartDate AND @p_endDate
试试这个:

SELECT
gpms.[birthdate]          AS [Date],
'Birthday'                AS [Event], 
gpms.[name]               AS [Name], 
gpms.[email]              AS [Email],     
gpms.[address]            AS [Address],   
FROM PERSONDETAILS gpms
JOIN @selectedpersons sgf  ON sgf.[account] = gpms.[account]    
WHERE DATEADD(year,DATEDIFF(YEAR, birthdate, @p_StartDate),birthdate) BETWEEN @p_StartDate AND @p_endDate
OR DATEADD(year,DATEDIFF(YEAR, birthdate, @p_endDate),birthdate) BETWEEN @p_StartDate AND @p_endDate
OR DATEADD(year,DATEDIFF(YEAR, Anniversary, @p_StartDate),Anniversary) BETWEEN @p_StartDate AND @p_endDate
OR DATEADD(year,DATEDIFF(YEAR, Anniversary, @p_endDate),Anniversary) BETWEEN @p_StartDate AND @p_endDate

这两个选项之间唯一不同的是where子句?如果我没有弄错的话,只有where子句不同,对吗?那么,为什么不使用
合并条件呢?也许我遗漏了一些东西,但是
在@p_StartDate和@p_endDate之间的[birthdate]比你正在做的
DATEADD(…DATEDIFF(…)
更容易些?