2012-03-28 3 views
0

나는이 질문에 대한 첫 번째 대답 테스트하기 위해 노력하고있어에 DB2 쿼리를 변환 할 필요 :이 질문에 대한 첫 번째 대답은 DB2로 작성는 TSQL

SQL - message schema - need to find an existing message thread given a set of users

을 내가 힘든 시간을 보내고있어 TSQL 응답을 변환합니다. 누군가 나를 알아낼 수있게 도와 줄 수 있습니까? 검색어는 다음과 같습니다.

WITH Selected_Users(id) as (VALUES (@id1), (@id2), --etc--), 
    Threads(id) as (SELECT DISTINCT threadFk 
        FROM ThreadMembers as a 
        JOIN Selected_Users as b 
        ON b.id = a.userFk) 
SELECT a.id 
FROM Threads as a 
WHERE NOT EXISTS (SELECT '1' 
        FROM ThreadMembers as b 
        LEFT JOIN Selected_Users as c 
        ON c.id = b.userFk 
        WHERE c.id IS NULL 
        AND b.threadFk = a.id) 
AND NOT EXISTS (SELECT '1' 
       FROM Selected_Users as b 
       LEFT JOIN ThreadMembers as c 
       ON c.userFk = b.id 
       AND c.threadFk = a.id 
       WHERE c.userFk IS NULL) 

검색어의 설명은 많은 도움이되는 답변의 일부입니다. 쿼리의 첫 번째 부분은 Selected_Users라는 임시 테이블을 만듭니다. 그러나 이것이 어떻게 수행 될지는 확실하지 않습니다. 미리 감사드립니다!

+0

나는 TSQL 버전으로 원래의 질문에 업데이트되었습니다. 감사! – Redtopia

답변

2

필자는 T-SQL이 DB2가 수행하는 목록 구문을 허용하지 않는다고 생각합니다.

WITH Selected_Users(id) AS (
    SELECT Id FROM (
     VALUES (@id1), (@id2), --etc-- 
    ) AS V(Id) 
), 
.... 

또는 당신이 진짜 임시 테이블을 만들 수 있습니다 (또는 변수) : 다음

DECLARE @selected_Users TABLE (id int); 
INSERT @selected_Users VALUES 
(@id1), 
(@id2), 
--etc.-- 
; --make sure to close with semi-colon before WITH CTE 

와 함께 Selected_Users 교체 안드리 M이 지적 하듯이 는 SQL 2008+는 매우 유사한 구문을 허용하지 나머지 검색어는 @selected_Users입니다. 당신이 UNION ALL을 할 수있는,

WITH Selected_Users(id) AS (
    SELECT * FROM @selected_Users 
), 
.... 

또는 : 또는 다음으로 초기 CTE를 변경

WITH Selected_Users(id) AS (
    SELECT @id1 
    UNION ALL SELECT @id2 
    UNION ALL SELECT @id3 
    --etc.-- 
), 
.... 
+0

좋아요! 도움이됩니다. 컬럼 이름에 문제가 있습니다. – Redtopia

+1

SQL Server (2008+)에서는 CTE의 행 집합 정의로 'VALUES (...), ...'을 직접 사용할 수 없지만 SELECT * FROM (VALUES) (@ id1), (@ id2), ...) x (v)'. SELECT *를 CTE에 넣을 수 있습니다. –

+0

@AndriyM - 신난다! 나는 그것에 대해 모른다 - 대답을 업데이 트 .... –

1

DB2에 익숙하지 않지만 Selected_Users 및 Thread "임시 테이블"이 CTE (공통 테이블 표현식 - 기본적으로 인라인보기)로되어있는 경우이를 다음으로 변경해야합니다.

WITH Selected_Users(id) AS 
(
    SELECT @id1 UNION 
    SELECT @id2 
), 
Threads(id) AS 
(
    SELECT DISTINCT 
     threadFk 
    FROM 
     ThreadMembers a 
    JOIN 
     Selected_Users b 
     ON 
     a.userFk = b.id 
) 
SELECT 
    a.Id 
FROM 
    Threads a 
WHERE 
... 

나는 곧 나머지를 생각하고 업데이트 할 것이다.