0

是否可以简化此 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
4

3 回答 3

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
;
于 2012-09-09T04:12:47.657 回答
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
于 2012-09-08T21:53:48.413 回答
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 中工作得更好。

于 2012-09-08T22:23:20.027 回答