2017-04-04 73 views
1

我做了這個驗證值:選擇並從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是目前這三個表中,但不明白什麼是錯的。

回答

2

的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 
+0

一般(對所有RDBMS)將不使用第一種解決方案會更安全嗎?因爲這不需要系統的任何改進。第二種解決方案可能會返回很多行,並使用'UNION'完成很多檢查。所以這可能會在內存和處理上花費很多 – AxelH

+0

@AxelH:是的,這是事實。通過第二個查詢,我們將依靠優化器查看並制定更好的執行計劃。儘管只需輸入一次12即可,但有一種方法(因此,一旦我們想將其改爲13,我們只需要在一個地方改變它,即查詢不太容易出錯)。 –

0
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 

您需要工會的結果包裝成一個表然後應用查詢

1

答案爲什麼您的查詢失敗已在另一個答案中給出。這是另一種方法。

您想知道某個表中是否存在值。但不是使用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) 
; 
+0

我喜歡這個符號,因爲這樣可以降低查詢的成本(至少我相信它會,不知道'in'的成本)並將參數(12)限制在一個地方。 – AxelH