需要将DB2查询转换为TSQL

时间:2012-03-28 21:57:03

标签: sql tsql db2

我正在尝试测试这个问题的第一个答案:

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

这个问题的第一个答案是用DB2编写的,我很难将答案转换为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的临时表,但我不确定如何完成。提前谢谢!

2 个答案:

答案 0 :(得分:2)

我认为T-SQL不允许DB2使用的列表语法。 正如Andriy M指出的那样,SQL 2008+确实允许使用非常相似的语法:

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替换为@selected_Users。或者将初始CTE更改为:

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

或者,您可以执行UNION ALL

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

答案 1 :(得分:1)

我不熟悉DB2,但如果Selected_Users和Threads“临时表”应该是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
 ...

我会考虑其余部分并尽快更新。