【发布时间】:2016-11-17 05:47:01
【问题描述】:
在性能方面,这是 LEFT OUTER JOIN 的一个很好的替代方案吗?是最好的吗?
SELECT a.PRODUCT_ID
,a.PROD_NAME
,a.PRODUCTTYPE_ID
,a.SUPPLIER_ID
,t.PRODTYPE_NAME
,s."NAME" SUPPLIER_NAME
FROM PRODUCT a
INNER JOIN (
SELECT NULL PRODUCTTYPE_ID
,NULL PRODTYPE_NAME
FROM rdb$database
UNION ALL
SELECT PRODUCTTYPE_ID
,PRODTYPE_NAME
FROM PRODUCTTYPE
) t
ON (t.PRODUCTTYPE_ID = a.PRODUCTTYPE_ID) OR (t.PRODUCTTYPE_ID IS NULL AND a.PRODUCTTYPE_ID IS NULL)
INNER JOIN (
SELECT NULL SUPPLIER_ID
,NULL "NAME"
FROM rdb$database
UNION ALL
SELECT SUPPLIER_ID
,"NAME"
FROM SUPPLIER
) s
ON (s.SUPPLIER_ID = a.SUPPLIER_ID) OR (s.SUPPLIER_ID IS NULL AND a.SUPPLIER_ID IS NULL)
根据主键和外键对表 PRODUCT 及其各自表中的 PRODUCT_ID、PRODUCTTYPE_ID、SUPPLIER_ID 进行索引
【问题讨论】:
-
你能发布使用左外连接的替代查询吗?您是否尝试过运行任何性能计时或查看查询的执行计划?
-
为什么你需要一个旧的
left join的替代品?你有某种性能问题吗?你有理由相信left join是原因吗? -
键并不总是创建索引(取决于 dbms 等),它们创建的任何索引都可能不适合您正在执行的查询。工会通常不是一个好的选择。需要更多地了解您遇到的问题。不过,我更精通 sql server。
-
我不明白——您显示的查询是非左连接吗?一定是因为它使用了内连接。
-
我在这里可能会因为过度概括而感到内疚。实际上,我在系统中有另一个声明是我真正关心的,但有相同的一般声明。