例として、次の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つのwhere句が同じテーブル列にあります)。クエリBは、ある意味ではきれいに見えますが(重複はありません)、サブクエリがあるため、効率が大幅に低下します。いわば、両方の世界を最大限に活用する方法はありますか?