在不使用union的情况下获得类似联合的结果

时间:2015-03-09 15:26:15

标签: sql oracle oracle10g

这是我的表结构:

Product(ID, Barcode, Name)

ChildProduct(ProductID, Barcode)

ChildProduct(ProductID) REFERENCES Product(ID)

以下是一些示例数据:

Product
(1,100,'A')
(2,200,'B')
(3,300,'C')
(4,400,'D')

ChildProduct
(1,101)
(1,102)
(2,201)
(4,401)

这是理想的结果:

(1,100,'A')
(1,101,'A')
(1,102,'A')
(2,200,'B')
(2,201,'B')
(3,300,'C')

这可以通过联合很容易地实现:

SELECT * FROM Product
WHERE ID IN (1,2,3)
UNION
SELECT * FROM ChildProduct cp
JOIN Product p ON (p.Id = cp.ProductID)
WHERE p.ProductID IN (1,2,3)

但是,实际上,此查询的WHERE部分是一个复杂的连接构造,所以我真的想避免使用UNION,因此我不必复制所有代码。

如何在不复制where子句的情况下实现相同的结果?

编辑:看起来我简化了一点点。我稍微调整了一下,以表明我必须在任何情况下加入ChildProduct和Product。

我真正想要的是彻底放松工会的方法。

2 个答案:

答案 0 :(得分:4)

您可以在派生表中执行UNION,并查询:

SELECT * FROM
    (SELECT Id, Barcode FROM Product
    UNION ALL
    SELECT ProductId, Barcode FROM PRODUCT) AS ProductAndChild
WHERE ProductAndChild.Id IN (1,2,3)

UNION ALLUNION快,所以如果你知道不会有重复,或者重复不重要,那就更好了。

答案 1 :(得分:2)

不是我推荐这个作为更快的选项..但是,您可以使用FULL OUTER JOIN复制结果... O.o

不确定为什么你想要这样做... [编辑]没有注意到OP的目的是简化的地方...稍微调整一下 - 使用David的回答..它解决了你的根问题:) [/ edit]

  select * from (
  select nvl(p.id,cp.productid) id,
         nvl(p.barcode, cp.barcode) barcode
    from product p
      full outer join 
           childproduct cp
        on p.id = cp.productid
          and p.barcode = cp.barcode
     )
   where id in (1,2,3)
  /

          ID    BARCODE
  ---------- ----------
           1        101
           1        102
           2        201
           2        200
           1        100
           3        300

  6 rows selected.

[edit]将查询调整为"简化"最后的地方..但是,这也可以通过工会完成: 选择*来自 ( 选择 )  联盟 选择 )

不会改变它......