1

我有以下查询

SELECT P.PRICE, P.PRODUCT_ID FROM PRODUCT P WHERE P.PRODUCT_ID IN (41,41)

由于应用程序代码的限制,我需要它两次返回产品记录。

我对 SQL 不太熟悉,所以真的卡住了,我不想为每个产品运行单个查询

4

4 回答 4

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's一样多次重复CROSS JOIN,并且主查询的JOINandWHERE条件只需要执行一次。

使用CROSS JOIN的好处是您不需要评估连接条件,它只是在两组数据之间生成笛卡尔积。

只需在CROSS JOIN所有主要操作的末尾JOIN添加即可手动复制数据。

于 2012-07-11T10:54:58.617 回答
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
于 2012-07-11T10:55:33.533 回答
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 ;
于 2012-07-11T11:02:17.987 回答
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)
        ;
于 2012-07-11T11:35:26.167 回答