簡體   English   中英

左外連接與OR或UNION

[英]LEFT OUTER JOIN with OR versus UNION

在WHERE子句中將UNION與LEFT OUTER JOIN與OR結合使用時,是否需要考慮重要的性能?

這兩個查詢有什么區別?

使用左外部聯接代替UNION通常會更好嗎?

我問的原因是我實際上需要執行INSERT,即使我想也不能使用UNION。

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);

與許多性能問題一樣,您應該在數據和系統上測試結果。 unionleft join的工作截然不同-最好取決於數據的功能,可用索引和其他考慮因素。

但是,您可以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方法更有效,但可以將更新分為多個單獨的update語句。

可以在插入中使用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"

至於性能,主要取決於索引。 兩者都可以快,都可以慢。 如果正確地為它們建立索引,那么您應該不會在兩者之間看到很大的差異。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM