为了举例,我们假设有3个表:
PHYSICAL_ITEM
ID
SELLER_ID
NAME
COST
DIMENSIONS
WEIGHT
DIGITAL_ITEM
ID
SELLER_ID
NAME
COST
DOWNLOAD_PATH
卖方
ID
NAME
两个项目表中的项目ID保证唯一。我想按顺序选择带有类型标签的给定卖家的所有商品ID。我想出来了:
查询A
SELECT PI.ID AS ID, 'PHYSICAL' AS TYPE
FROM PHYSICAL_ITEM PI
JOIN SELLER S ON PI.SELLER_ID = S.ID
WHERE S.NAME = 'name'
UNION
SELECT DI.ID AS ID, 'DIGITAL' AS TYPE
FROM DIGITAL_ITEM DI
JOIN SELLER S ON DI.SELLER_ID = S.ID
WHERE S.NAME = 'name'
ORDER BY ID
查询B
SELECT ITEM.ID, ITEM.TYPE
FROM (SELECT ID, SELLER_ID, 'PHYSICAL' AS TYPE
FROM PHYSICAL_ITEM
UNION
SELECT ID, SELLER_ID, 'DIGITAL' AS TYPE
FROM DIGITAL_ITEM) AS ITEM
JOIN SELLER ON ITEM.SELLER_ID = SELLER.ID
WHERE SELLER.NAME = 'name'
ORDER BY ITEM.ID
查询A似乎是最有效的,但它看起来也不必要地重复(同一个表的2个表连接,同一个表列上的2个子句)。查询B对我来说看起来更干净(没有重复),但它看起来效率也低得多,因为它有一个子查询。有没有办法让两全其美,可以这么说?
答案 0 :(得分:0)
在这两种情况下,请将union
替换为union all
。 Union
会不必要地删除重复项。
我希望查询A更有效率,因为优化器在进行连接时有更多信息(尽管我认为Oracle甚至在联合后使用索引也相当不错)。此外,第一个查询减少了联合之前的数据量。
然而,这只是一种意见。真正的测试是对两个查询进行计时 - 多次以避免缓存填充延迟 - 以查看哪个更好。