簡體   English   中英

SQL LEFT JOIN OR條件的更好方法

[英]Better way for SQL LEFT JOIN OR condition

我已經進行了一些搜索但沒有成功,我想知道是否有一些更好的方法來重寫sql查詢,因為LEFT JOIN中的OR條件會降低性能:(

例如:

SELECT DISTINCT * FROM computers
LEFT JOIN monitors ON computers.brand = monitors.brand
LEFT JOIN keyboards ON computers.type = keyboards.type
LEFT JOIN accessories ON accessories.id = keyboards.id OR accessories.id = monitors.id
GROUP BY computers.id
ORDER BY computers.id DESC

抱歉,您的問題很愚蠢,但是可以重寫OR語句來提高性能嗎?

我懷疑這會有所不同,但是您可以嘗試執行以下操作:

SELECT DISTINCT * 
FROM computers
LEFT JOIN monitors ON computers.brand = monitors.brand
LEFT JOIN keyboards ON computers.type = keyboards.type
LEFT JOIN accessories ON a1.id IN (keyboards.id, monitors.id)
GROUP BY computers.id
ORDER BY computers.id DESC

如果您願意使用兩組配件列(也可以在SELECT列表中使用一束coalesce() ,則也可以兩次連接到同一張表:

SELECT DISTINCT * FROM computers
LEFT JOIN monitors ON computers.brand = monitors.brand
LEFT JOIN keyboards ON computers.type = keyboards.type
LEFT JOIN accessories a1 ON a1.id = keyboards.id 
LEFT JOIN accessories a2 ON a2.id = monitors.id
GROUP BY computers.id
ORDER BY computers.id DESC

而且,首先,此查詢在大多數現代數據庫引擎中都不合法。 如果要對字段GROUP BY ,則ANSI SQL標准說您也不能只將* (即使使用DISTINCT )放在SELECT列表中,因為您沒有指定在數據庫滾動時要保留的值和要丟棄的值組...結果是不確定的,這是一件壞事。

您正在執行SELECT DISTINCT * ,因此它將檢查您的整個記錄​​在它得到的所有行中都是唯一的,這是3個表的價值。 如果正確設置了您的主鍵和唯一索引,則它可能已經是唯一的了,因此它絕對是唯一的,因此只需將其取出即可。

如果您的主鍵和索引沒有設置,請首先執行此操作。 名為id的字段上的主鍵。

那和SELECT *會產生很大的開銷,因為它必須弄清楚其余的列是什么。

在不知道表結構實際是什么的情況下進行猜測:由於要按GROUP BY computers.id進行分組,因此請將其放入SELECT並將其從GROUP BY取出。

SELECT DISTINCT computers.id

暫無
暫無

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

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