是否可以简化此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
答案 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中运行得更好。