是否可以简化此SQL UNION查询?

时间:2012-09-08 21:12:15

标签: mysql sql union rdbms

是否可以简化此UNION以避免联合查询的近乎冗余?如此处所示,两个查询都类似。他们只是加入table2中的不同列。我在同一个查询中使用Union而不仅仅是Inner Joining 2x的原因是因为这个查询被用作子查询,结果必须在1列中。

SELECT t1.id as id
FROM table1 g
INNER JOIN table2 t1 on g.t_id = t1.id
WHERE g.id=1
UNION
SELECT t2.id as id2
FROM table1 g
INNER JOIN table2 t2 on g.t2_id = t2.id
WHERE g.id=1

3 个答案:

答案 0 :(得分:2)

我不明白为什么这不能被视为一个简单的内连接,可以通过两个谓词中的任何一个匹配来满足。为清楚起见,我删除了t1,t2和g的原始表别名。由于我不知道查询是否可以产生重复的行,所以我使用DISTINCT来以与UNION在原始查询中所做的相同的方式折叠重复的行。

SELECT DISTINCT table2.id
FROM table1
INNER JOIN table2
ON ( table1.t_id = table2.id OR table1.t2_id = table2.id )
WHERE table1.id = 1
;

答案 1 :(得分:1)

可以使用两个连接和IFNULL()函数:

SELECT IFNULL (t1.id, t2.id) as id
FROM table1 g
INNER JOIN table2 t1 on g.t_id = t1.id
INNER JOIN table2 t2 on g.t2_id = t2.id
WHERE g.id=1

答案 2 :(得分:1)

您可能会发现这更简单:

select distinct t.id
from table2 t
where t.id in (select g.t_id from table1 g) or
      t.id in (select g.t2_id from table1 g)

但是,MySQL的性能会很糟糕。你也可以这样做:

select distinct t.id
from table2 t
where exists (select 1 from table1 g where g.t_id = t.id or g.t2_id = t.id)

第二个版本应该在MySQL中运行得更好。