我有以下查询
SELECT P.PRICE, P.PRODUCT_ID FROM PRODUCT P WHERE P.PRODUCT_ID IN (41,41)
由于应用程序代码的限制,我需要它两次返回产品记录。
我对 SQL 不太熟悉,所以真的卡住了,我不想为每个产品运行单个查询
要使其出现两次,您可以执行以下操作:
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
's一样多次重复CROSS JOIN
,并且主查询的JOIN
andWHERE
条件只需要执行一次。
使用CROSS JOIN
的好处是您不需要评估连接条件,它只是在两组数据之间生成笛卡尔积。
只需在CROSS JOIN
所有主要操作的末尾JOIN
添加即可手动复制数据。
试试这个::
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
另一种方式(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 ;
笛卡尔积(类似于交叉连接):
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)
;