Mysql 从3个表中选择并验证一个值
我已作出以下声明:Mysql 从3个表中选择并验证一个值,mysql,sql,Mysql,Sql,我已作出以下声明: (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语句必须连接到call 3个表: SELECT numero
(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语句必须连接到call 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
您需要将联合的结果包装到一个表中,然后对该表应用查询查询失败的原因已在另一个答案中给出。这是另一种方法 您想知道其中一个表中是否存在值。但是,您可以从所有表中进行选择,粘贴它们的结果并消除重复项,而不是使用
EXISTS
(或中的)。这里有一种选择12的方法,如果在任何表中找到12(优化器可以应用一种算法,只在找到第一个匹配之前读取):
一般来说(对于所有RDBMS),使用第一种解决方案不是更安全吗?因为这不需要系统的任何改进。第二种解决方案可以返回大量行,并使用联合
完成大量检查。因此,这可能会花费大量内存和内存processing@AxelH:是的,那是真的。对于第二个查询,我们将依靠优化器看穿这一点并制定更好的执行计划。这是一种只需键入12的方法(因此,一旦我们想将其更改为13,我们只需在一个地方更改它,即查询不太容易出错)。我喜欢这种表示法,因为它可以降低查询的成本(至少我相信它会,不知道
中的成本)并限制参数(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
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)
;