我有一个像这样的SQL查询:
ConsulPropertySource
注意重复值'item2'。 我希望查询返回该项的值多次出现在IN子句中。默认情况下,它只返回一次。我怎么能这样做?
答案 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