2016-03-04 21 views
2

我想存儲從一個子查詢的值的列表中陳述在我的查詢重用:店子查詢與重用在陳述

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) 

它是無效的。我怎樣才能做到這一點?

回答

2

你可以使用:

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列表一次。

+0

我只是想知道是否有任何理由實際使用這種語法,而不是直接的'UNION'。 –

+0

@ PM77-1有一個非查詢優化器足夠智能或不計算'SELECT ID FROM Users'一次。 – lad2025

+0

查詢optmizer足夠聰明,無法重新計算此ID列表? –