Mysql 与或对并集的左外连接

Mysql 与或对并集的左外连接,mysql,sql,Mysql,Sql,在WHERE子句中使用UNION与LEFT OUTER JOIN之间是否存在重要的性能考虑因素 这两个查询之间有什么区别 使用左外联接而不是并集通常更好吗 我问这个问题的原因是我实际上需要做一个插入,即使我想也不能使用工会 SELECT t.foo FROM t INNER JOIN t1 t1.t_id=t.id WHERE t1.id IN (1,2,3) UNION SELECT t.foo FROM t INNER JOIN t2 t2.t_id=t.id INNER JOIN t2a

在WHERE子句中使用UNION与LEFT OUTER JOIN之间是否存在重要的性能考虑因素

这两个查询之间有什么区别

使用左外联接而不是并集通常更好吗

我问这个问题的原因是我实际上需要做一个插入,即使我想也不能使用工会

SELECT t.foo
FROM t
INNER JOIN t1 t1.t_id=t.id
WHERE t1.id IN (1,2,3)
UNION
SELECT t.foo
FROM t
INNER JOIN t2 t2.t_id=t.id
INNER JOIN t2a ON t2a.t2_id=t2.id
WHERE t2a.id IN (1,2,3)
UNION
SELECT t.foo
FROM t
INNER JOIN t3 t3.t_id=t.id
INNER JOIN t3a ON t3a.t3_id=t3.id
WHERE t3a.id IN (1,2,3);

SELECT DISTINCT t.foo
FROM t
LEFT OUTER JOIN t1 t1.t_id=t.id
LEFT OUTER JOIN t2 t2.t_id=t.id
LEFT OUTER JOIN t2a ON t2a.t2_id=t2.id
LEFT OUTER JOIN t3 t3.t_id=t.id
LEFT OUTER JOIN t3a ON t3a.t3_id=t3.id
WHERE t1.id IN (1,2,3) OR t2a.id IN (1,2,3) OR t3a.id IN (1,2,3);

UPDATE t
LEFT OUTER JOIN t1 t1.t_id=t.id
LEFT OUTER JOIN t2 t2.t_id=t.id
LEFT OUTER JOIN t2a ON t2a.t2_id=t2.id
LEFT OUTER JOIN t3 t3.t_id=t.id
LEFT OUTER JOIN t3a ON t3a.t3_id=t3.id
SET t.foo="bar"
WHERE t1.id IN (1,2,3) OR t2a.id IN (1,2,3) OR t3a.id IN (1,2,3);

与许多性能问题一样,您应该在数据和系统上测试结果。
union
left-join
s做的事情非常不同,哪一个更好可能取决于数据的特性、可用索引和其他考虑因素

但是,您可以使用
update
中的
union
方法。您只需要一个子查询:

update t join
       (select t.id, t1.foo . . .
        union . . . 
        select t.id, t2.foo
       ) tt
       on t.id = tt.id
    set t.foo = 'foo'
    where . . .;

您可能还会发现,使用
联合
方法更有效,但将更新分解为多个单独的
更新
语句。

与许多性能问题一样,您应该在数据和系统上测试结果。
union
left-join
s做的事情非常不同,哪一个更好可能取决于数据的特性、可用索引和其他考虑因素

但是,您可以使用
update
中的
union
方法。您只需要一个子查询:

update t join
       (select t.id, t1.foo . . .
        union . . . 
        select t.id, t2.foo
       ) tt
       on t.id = tt.id
    set t.foo = 'foo'
    where . . .;
您还可能会发现使用
联合
方法更有效,但可以将更新分解为多个单独的
更新
语句。

您可以在插入中使用
联合

INSERT INTO `table`
SELECT * FROM   
(
    SELECT '1'
    UNION
    SELECT '2'
) x
更新也是如此:

UPDATE `table1` t1
JOIN (
    SELECT '1' as col1
    UNION
    SELECT '2'
) x ON x.col1 = t1.colX  
SET t1.whateverColumn = "someValue"
至于性能,主要取决于指标。两者都可以是快的,也可以是慢的。如果索引正确,就不会看到两者之间有太大的差异。

您可以在insert中使用
UNION

INSERT INTO `table`
SELECT * FROM   
(
    SELECT '1'
    UNION
    SELECT '2'
) x
更新也是如此:

UPDATE `table1` t1
JOIN (
    SELECT '1' as col1
    UNION
    SELECT '2'
) x ON x.col1 = t1.colX  
SET t1.whateverColumn = "someValue"

至于性能,主要取决于指标。两者都可以是快的,也可以是慢的。如果索引正确,则不应看到两者之间的巨大差异。

为什么不能使用union?检查两个查询的解释计划,运行它们,您将能够看到执行哪一个查询better@sagi你将如何使用一个更新?不管怎样,我还是想更好地理解这两种方法的含义。@sagi还是我只是把UNION放在WHERE子句中?就像@GordonLinoff solution一样为什么不能使用UNION?检查两个查询的解释计划,运行它们,您将能够看到执行哪一个查询better@sagi你将如何使用一个更新?不管怎样,仍然希望更好地理解这两种方法的含义。@sagi还是我只是把UNION放在WHERE子句中?就像@GordonLinoff solution你所说的
是什么意思?你可能会发现使用UNION方法更有效,但要将更新分解为多个单独的更新语句。
?他的意思是这样的不要使用union,而是使用第一个select更新一次,使用第二个select更新一次(两个不同的update语句或更多),因此,使用三个单独的查询?@user1032531。对
联合中的每个子查询执行一个查询
。你所说的
是什么意思?你可能会发现使用联合方法更有效,但可以将更新分解为多个单独的更新语句。
?他的意思是,不使用联合,而是使用第一个选择更新一次,使用第二个选择更新一次(两个或更多不同的更新语句)因此,使用三个单独的查询?@user1032531…为
联合中的每个子查询使用一个查询。