【问题标题】:Need to convert DB2 query to TSQL需要将 DB2 查询转换为 SQL
【发布时间】:2012-03-29 22:00:43
【问题描述】:

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

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 的临时表,但我不确定这将如何完成。提前致谢!

【问题讨论】:

  • 我用 TSQL 版本更新了原始问题。谢谢!

标签: sql tsql db2


【解决方案1】:

我认为 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.--
),
....

【讨论】:

  • 太棒了!这有帮助。我在列名方面遇到了一些问题。
  • 在 SQL Server (2008+) 中,您不能直接使用 VALUES (...), ... 作为 CTE 中行集的定义,但您可以从中选择:SELECT * FROM (VALUES (@id1), (@id2), ...) x (v)。该 SELECT 可以 放入 CTE。
【解决方案2】:

我不熟悉 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
 ...

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-28
    • 2014-11-08
    相关资源
    最近更新 更多