我做了这个验证值:选择并从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,我们只需要在一个地方改变它,即查询不太容易出错)。 –