2017-04-04 70 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