使用 WITH 存储子查询以便在 IN 语句中重复使用
Store subquery with WITH for re-use in IN statements
我想存储子查询中的值列表,以便在 IN 语句中跨我的查询重复使用:
WITH ListOfIds AS (SELECT Id FROM Users)
(SELECT COUNT(*) FROM Foo WHERE Foo.UserId IN ListOfIds)
UNION
(SELECT COUNT(*) FROM Bar WHERE Bar.UserId IN ListOfIds)
无效。我该怎么做?
您可以使用:
WITH ListOfIds AS (SELECT Id FROM Users)
SELECT COUNT(*)
FROM Foo
WHERE Foo.UserId IN (SELECT Id FROM ListOfIds)
UNION
SELECT COUNT(*)
FROM Bar
WHERE Bar.UserId IN (SELECT Id FROM ListOfIds)
虽然有点无意义。
可能 UNION ALL
而不是 UNION
。我没有看到跳过计数的意义。
你应该留在:
SELECT COUNT(*)
FROM Foo
WHERE Foo.UserId IN (SELECT Id FROM Users)
UNION
SELECT COUNT(*)
FROM Bar
WHERE Bar.UserId IN (SELECT Id FROM Users)
我想查询优化器足够聪明,可以一次获得 Id
的列表。
我想存储子查询中的值列表,以便在 IN 语句中跨我的查询重复使用:
WITH ListOfIds AS (SELECT Id FROM Users)
(SELECT COUNT(*) FROM Foo WHERE Foo.UserId IN ListOfIds)
UNION
(SELECT COUNT(*) FROM Bar WHERE Bar.UserId IN ListOfIds)
无效。我该怎么做?
您可以使用:
WITH ListOfIds AS (SELECT Id FROM Users)
SELECT COUNT(*)
FROM Foo
WHERE Foo.UserId IN (SELECT Id FROM ListOfIds)
UNION
SELECT COUNT(*)
FROM Bar
WHERE Bar.UserId IN (SELECT Id FROM ListOfIds)
虽然有点无意义。
可能 UNION ALL
而不是 UNION
。我没有看到跳过计数的意义。
你应该留在:
SELECT COUNT(*)
FROM Foo
WHERE Foo.UserId IN (SELECT Id FROM Users)
UNION
SELECT COUNT(*)
FROM Bar
WHERE Bar.UserId IN (SELECT Id FROM Users)
我想查询优化器足够聪明,可以一次获得 Id
的列表。