在不使用 union 的情况下获得类似 union 的结果
Get a union-like result without using union
这是我的table结构:
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。
我真正在寻找的是一种完全松开工会的方法。
您可以对派生的 table 执行 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 ALL
比 UNION
快,因此如果您知道不会有重复项,或者如果重复项无关紧要,则更可取)
并不是说我建议将此作为更快的选项。但是,您可以使用 FULL OUTER JOIN 复制结果...O.o
不确定你为什么要这样做......[编辑]没有注意到 OP 的目的是为了简化 where......稍微调整一下 - 使用 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] 将查询调整为 "simplify" 最后一个 where .. 同样,这也可以通过 union 来完成:
select * 来自
( select )
联盟
select
)
其中
变化不大...
这是我的table结构:
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。
我真正在寻找的是一种完全松开工会的方法。
您可以对派生的 table 执行 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 ALL
比 UNION
快,因此如果您知道不会有重复项,或者如果重复项无关紧要,则更可取)
并不是说我建议将此作为更快的选项。但是,您可以使用 FULL OUTER JOIN 复制结果...O.o
不确定你为什么要这样做......[编辑]没有注意到 OP 的目的是为了简化 where......稍微调整一下 - 使用 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] 将查询调整为 "simplify" 最后一个 where .. 同样,这也可以通过 union 来完成: select * 来自 ( select ) 联盟 select ) 其中
变化不大...