2012-09-08 122 views
0

是否可以简化这个UNION以避免查询的近似冗余正在联合?如这里所见,两个查询都是相似的。他们只是加入了table2中的不同列。我使用Union的原因,而不是在同一个查询中只是内部连接2x,因为结果必须位于1列中,这是因为此查询用作子查询。可以简化这个SQL UNION查询吗?

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 
+1

这看起来很像您以前的问题。有什么不同吗? – Kermit

+0

区别在于where子句在这里是一样的。内部连接是不同的。两个问题的答案都不一样。 – glutz

回答

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 
; 
+0

,这是正确的。谢谢! – glutz

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 
+0

该查询不会产生与原始查询相同的结果,因为此查询要求两个连接都成功才能显示在结果集中。如果连接条件满足,原始查询将生成一行。 –

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中工作得更好。

+0

这两个都不是g.id = 1 – glutz