在共享第3表中按值过滤来自2个表的数据的最佳方法

时间:2013-01-11 15:36:48

标签: sql oracle

为了举例,我们假设有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对我来说看起来更干净(没有重复),但它看起来效率也低得多,因为它有一个子查询。有没有办法让两全其美,可以这么说?

1 个答案:

答案 0 :(得分:0)

在这两种情况下,请将union替换为union allUnion会不必要地删除重复项。

我希望查询A更有效率,因为优化器在进行连接时有更多信息(尽管我认为Oracle甚至在联合后使用索引也相当不错)。此外,第一个查询减少了联合之前的数据量。

然而,这只是一种意见。真正的测试是对两个查询进行计时 - 多次以避免缓存填充延迟 - 以查看哪个更好。