mysql根据IN CLAUSE中使用的相同密钥返回重复记录

时间:2012-07-11 10:53:58

标签: mysql sql

我有以下查询

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

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

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

4 个答案:

答案 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以及JOINWHERE条件的重复次数相同。主查询只需要执行一次。

使用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)
        ;