我有以下查询
SELECT P.PRICE, P.PRODUCT_ID FROM PRODUCT P WHERE P.PRODUCT_ID IN (41,41)
由于应用程序代码的限制,我需要它返回产品记录两次。
我对SQL不太熟悉,所以真的卡住了,我不想为每个产品运行单个查询
答案 0 :(得分:3)
要使其显示两次,您可以执行以下操作:
SELECT P.PRICE, P.PRODUCT_ID FROM PRODUCT P WHERE P.PRODUCT_ID IN (41)
UNION ALL
SELECT P.PRICE, P.PRODUCT_ID FROM PRODUCT P WHERE P.PRODUCT_ID IN (41)
UNION
运营商的作用基本上是"大概"对另一个的结果进行一次查询的结果......所以在你的情况下,我们正在"定位"在相同的精确选择上,以便在最终结果中将所有行重复两次。
但是,对于更复杂的查询,您可能想要做的是使用CROSS JOIN
:
SELECT P.PRICE, P.PRODUCT_ID
FROM PRODUCT P
INNER JOIN ...
INNER JOIN ...
CROSS JOIN
(
SELECT NULL UNION ALL
SELECT NULL
) cj
WHERE P.PRODUCT_ID IN (41) AND ... AND ... AND ..
通过这种方式,行的重复次数将与SELECT NULL
子选择中的CROSS JOIN
以及JOIN
和WHERE
条件的重复次数相同。主查询只需要执行一次。
使用CROSS JOIN
的好处在于,您不需要评估连接条件,它只是在两组数据之间生成笛卡尔积。
只需点击所有主要CROSS JOIN
操作结尾处的JOIN
即可手动复制数据。
答案 1 :(得分:3)
试试这个::
SELECT P.PRICE, P.PRODUCT_ID FROM PRODUCT P WHERE P.PRODUCT_ID=41
UNION ALL
SELECT P.PRICE, P.PRODUCT_ID FROM PRODUCT P WHERE P.PRODUCT_ID=41
答案 2 :(得分:1)
另一种方式(在内部级别使用UNION ALL
)。更容易与复杂查询结合(正如您在评论中提到的那样):
SELECT p.price, p.product_id
FROM
PRODUCT AS p
JOIN
( SELECT 41 AS product_id
UNION ALL
SELECT 41
) AS selection
ON p.product_id = selection.product_id ;
答案 3 :(得分:0)
笛卡尔积(类似于交叉连接):
SELECT P.PRICE, P.PRODUCT_ID
FROM FROM PRODUCT P
JOIN (values(1),(2) ) AS two ON 1=1
WHERE P.PRODUCT_ID IN (42)
;