我正在尝试测试这个问题的第一个答案:
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的临时表,但我不确定如何完成。提前谢谢!
答案 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
...
我会考虑其余部分并尽快更新。