繁体   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