在WHERE IN中使用SELECT结果的别名

时间:2017-05-10 21:26:37

标签: mysql mariadb

我有一个查询,我使用WHERE IN SELECT。这是查询:

SELECT tville_id, tville_nom, tville_etat
FROM TAB_ZONE   
INNER JOIN TAB_VILLES ON tville_id = tzone_cidade
WHERE tzone_unidade1 = 1 
   OR tzone_unidade2 = 1 
   OR tzone_unidade3 = 1 
   OR tzone_unidade1 IN (SELECT tunidade_id FROM TAB_UNIDADE WHERE tunidade_parent = 1)
   OR tzone_unidade2 IN (SELECT tunidade_id FROM TAB_UNIDADE WHERE tunidade_parent = 1)
   OR tzone_unidade3 IN (SELECT tunidade_id FROM TAB_UNIDADE WHERE tunidade_parent = 1)
ORDER BY tville_etat, tville_nom

它可以工作,但正如你所看到的,我有三次在WHERE部分中使用“SELECT tunidade_id”语句。有没有办法将此SELECT的结果用作别名,所以只执行一次? (它有用吗?)

由于

4 个答案:

答案 0 :(得分:2)

MariaDB 10.2中,您可以common-table expressions使用this purpose

connect()

它是否会为您带来显着的性能提升 - 我想最好的方法是尝试;但至少可以通过这种方式更好地维护查询。

答案 1 :(得分:1)

我还没有验证,但根据我的理解,这样的事情应该有效:

SELECT tville_id, tville_nom, tville_etat
FROM TAB_ZONE   
INNER JOIN TAB_VILLES ON tville_id = tzone_cidade
JOIN (SELECT tunidade_id FROM TAB_UNIDADE WHERE tunidade_parent = 1 UNION SELECT 1) x on x.tunidade_id in (tzone_unidade1, tzone_unidade2, tzone_unidade3)
ORDER BY tville_etat, tville_nom

答案 2 :(得分:0)

如果没有错,可以将以下条件合并为一个

OR tzone_unidade1 IN (SELECT tunidade_id FROM TAB_UNIDADE WHERE tunidade_parent = 1)
OR tzone_unidade2 IN (SELECT tunidade_id FROM TAB_UNIDADE WHERE tunidade_parent = 1)
OR tzone_unidade3 IN (SELECT tunidade_id FROM TAB_UNIDADE WHERE tunidade_parent = 1)

类似

OR (tzone_unidade1,tzone_unidade2,tzone_unidade3) IN (SELECT tunidade_id FROM TAB_UNIDADE WHERE tunidade_parent = 1)

答案 3 :(得分:0)

最好是跨列传播数组。而是在另一个表中有多个行。通过这样,您可以避免重复查询,CTE,性能问题等。