SQL IN语句 - 返回结果时保留重复项

时间:2015-11-20 20:27:52

标签: mysql sql select

我有一个像这样的SQL查询:

ConsulPropertySource

注意重复值'item2'。 我希望查询返回该项的值多次出现在IN子句中。默认情况下,它只返回一次。我怎么能这样做?

5 个答案:

答案 0 :(得分:3)

然后你需要使用left join

select p.*
from (select 'item1' as item union all select 'item2' union all
      select 'item2' union all select 'item3'
     ) i left join
     prices p
     on i.item = p.item;

答案 1 :(得分:1)

SQL将IN列表中的项目视为一个集合,忽略重复项。

在支持表值参数(TVP)的数据库中,您可以使用TVP上的内部联接替换IN,但MySQL不提供它们。

另一种方法是使用IN列表中的项填充临时表,并使用内部联接查询它:

CREATE TEMPORARY TABLE InList (item varchar(10)); 
INSERT INTO InList(item) VALUES ('item1');
INSERT INTO InList(item) VALUES ('item2');
INSERT INTO InList(item) VALUES ('item2');
INSERT INTO InList(item) VALUES ('item3');

现在您的查询将如下所示:

SELECT p.*
FROM prices p
INNER JOIN InList i ON i.item = p.item

由于加入会生成笛卡尔积,因此price行将重复次数与临时InList表中列出的次数相同。

答案 2 :(得分:0)

你不能。该查询将返回item1在表格中显示的次数,而不是其在查询中显示的次数

答案 3 :(得分:0)

您可以做的一件事是查找每个项目的出现次数,然后检查您想要的数字,如下所示:

SELECT * FROM prices po WHERE
EXISTS (SELECT item FROM prices pi
        WHERE pi.item = po.item
        GROUP BY item
        HAVING ( (COUNT(item) = 1 AND item in ('item1', 'item3') )
            OR ( (COUNT(item) = 2 AND item = 'item2' )
       )

由于这将返回所有匹配项,您将在结果中显示每个项目在价格表中显示的次数。

关于戈登答案的两个注释(因为我在这里是新的并且不能在那里发表评论): (1)左外连接可能导致返回空值。如果item3根本没有出现在价格中,那么结果中将出现null。您可以使用过滤器(其中p.item不为null)来删除这些空值。 (2)如果item2在price表中只出现一次,则join将仍然在结果中出现两次。连接不会检查item2在价格中出现两次,它只是将它连接两次到FROM子句中创建的常量表。

答案 4 :(得分:0)

SELECT *
FROM PRICE
WHERE ITEM IN (item1, item2, item3)

UNION ALL

SELECT *
FROM PRICE
WHERE ITEM = item2