我做了這個驗證值:選擇並從3個表
(SELECT numerocert FROM certificati)
UNION
(SELECT numeroarbo AS numerocert FROM cert_arbo)
UNION
(SELECT numeroerba AS numerocert FROM cert_erba)
WHERE numerocert = 12
我想看看數字12是目前這三個表中,但不明白什麼是錯的。
我做了這個驗證值:選擇並從3個表
(SELECT numerocert FROM certificati)
UNION
(SELECT numeroarbo AS numerocert FROM cert_arbo)
UNION
(SELECT numeroerba AS numerocert FROM cert_erba)
WHERE numerocert = 12
我想看看數字12是目前這三個表中,但不明白什麼是錯的。
的WHERE語句必須連接調用3個表:
SELECT numerocert FROM certificati WHERE numerocert = 12
UNION
SELECT numeroarbo AS numerocert FROM cert_arbo WHERE numeroarbo = 12
UNION
SELECT numeroerba AS numerocert FROM cert_erba WHERE numeroerba = 12
,或者你她使用一個外部查詢:
select numerocert from (
(SELECT numerocert FROM certificati)
UNION
(SELECT numeroarbo AS numerocert FROM cert_arbo)
UNION
(SELECT numeroerba AS numerocert FROM cert_erba)
)
WHERE numerocert = 12
Select *
From
(SELECT numerocert FROM certificati
UNION
SELECT numeroarbo AS numerocert FROM cert_arbo
UNION
SELECT numeroerba AS numerocert FROM cert_erba) tab
WHERE numerocert = 12
您需要工會的結果包裝成一個表然後應用查詢
答案爲什麼您的查詢失敗已在另一個答案中給出。這是另一種方法。
您想知道某個表中是否存在值。但不是使用EXISTS
(或IN
),您可以從所有表中選擇,粘貼其結果並消除重複項。這裏是選擇12的一種方式,如果在任何表中找到(和優化器可以應用算法,其中它只讀取,直到找到的第一個匹配):
select numerocert
from (select 12 as numerocert) t
where numerocert in (select numerocert from certificati)
or numerocert in (select numeroarbo from cert_arbo)
or numerocert in (select numeroerba from cert_erba)
;
我喜歡這個符號,因爲這樣可以降低查詢的成本(至少我相信它會,不知道'in'的成本)並將參數(12)限制在一個地方。 – AxelH
一般(對所有RDBMS)將不使用第一種解決方案會更安全嗎?因爲這不需要系統的任何改進。第二種解決方案可能會返回很多行,並使用'UNION'完成很多檢查。所以這可能會在內存和處理上花費很多 – AxelH
@AxelH:是的,這是事實。通過第二個查詢,我們將依靠優化器查看並制定更好的執行計劃。儘管只需輸入一次12即可,但有一種方法(因此,一旦我們想將其改爲13,我們只需要在一個地方改變它,即查詢不太容易出錯)。 –