2011-06-16 90 views
0

編輯:我想參加下面的查詢SQL SELECT查詢邏輯,用2份

QUERY1

SELECT  r.userId, r.programmeId, u.email, u.firstName, u.lastName, u.profileId, tblProgrammes.name, u.storeId, r.dateEnded AS lastPass, r.dateExpired 
FROM   tblUserRepeatHistory AS r INNER JOIN 
         tblUsers AS u ON r.userId = u.id INNER JOIN 
         tblProgrammes ON r.programmeId = tblProgrammes.id 
WHERE  (u.storeId = @storeId) AND (r.userId = @userId) 
GROUP BY r.userId, r.programmeId, u.email, u.firstName, u.lastName, u.profileId, tblProgrammes.name, u.storeId, r.dateEnded, r.dateExpired 
HAVING  (DATEDIFF(D, MAX(r.dateExpired), GETDATE() + 31) >= 0) 

QUERY2

SELECT TOP (1) r.id, p.maxSteps 
FROM tblUserQuestionnaireHistory AS r INNER JOIN 
tblProgrammes AS p ON r.programmeId = p.id AND r.stepId = p.maxSteps 
WHERE (r.userId = @UserId) AND (r.programmeId = @ProgrammeId) AND (r.success = 1) 
ORDER BY r.id DESC 

的語法應該如下

從QUERY1連接QUERY2中選擇全部QUERY2不記錄任何記錄。即如果QUERY2返回true總比不介意從QUERY1第一部分

SELECT * WHERE NOT EXISTS JOIN QUERY2其中@userId和@programmeId查詢2來自QUERY1

+0

您不指定哪個**版本的SQL Server .....如果您使用的是SQL Server 2005或更新的版本,則可能需要使用[Common Table Expression(CTE )](http://www.simple-talk.com/sql/t-sql-programming/sql-server-cte-basics/)設置你的第一個選擇,然後加入然後結果CTE提供給第二個選擇你需要..... – 2011-06-16 10:47:05

回答

0

你可以使用outer apply找到返回的記錄top 1一排匹配您的條件:

select * 
from tblUserRepeatHistory u 
outer apply 
     (
     select top 1 * 
     from tblUserQuestionnaireHistory r 
     on  r.userId = u.UserId 
       and r.programmeId = u.programmeId 
       and r.success = 1 
       and r.stepId = 9 
     ) as r 
0

這是您的意思嗎?

SELECT r.userId, r.programmeId, u.email, u.firstName, (SELECT TOP (1) r.id FROM tblUserQuestionnaireHistory AS r WHERE (r.userId = urh.UserId) AND (r.programmeId = urh.ProgrammeId) AND (r.success = 1) AND r.stepId = 9) 
FROM tblUserRepeatHistory urh 
where urh.UserId = @UserId and usr.ProgrammeId = @programmeId