如何使SQL返回重复项?

时间:2017-10-30 00:54:36

标签: python sql django postgresql

运行SQL时,如下所示;

SELECT * FROM items WHERE item_name IN ('fish', 'frog', 'fish')
我得到1只青蛙和1条鱼。这是预期和正常的行为,因为WHERE子句无疑会单独评估数据库中的每一行。

但是,在我当前的应用程序中,我需要为WHERE子句中的每个项目返回一个完整的行。我目前正在这样做的方法是获取IN语句的全部内容,然后运行第二个查询来获取每个对象。在python中,我然后根据需要复制行。但是,如果我能让sql为我做这件事,它意味着减少1次往返数据库。

您是否可以强制数据库在IN?/ / p>中为每个条目返回响应

示例数据;

id | name | price
1  | frog | 4
2  | fish | 3

用户对象

id | user_id | item_name
1  | 1       | fish
1  | 1       | frog
1  | 1       | fish

我知道item_name应该是item的外键 - 但是由于遗产原因令人沮丧,目前无法实现。

一个理想的解决方案可以让我轻松地通过Django ORM实现这一目标 - 但是如果这不太可能,那么其​​他答案都非常受欢迎。

3 个答案:

答案 0 :(得分:2)

您可以将Fish,Frog和Fish放入临时表/表变量中并将它们连接到项目,而不是使用IN子句:

create table items (id int primary key, item_names varchar(20))
DECLARE @animal table (animal_name varchar(20))
insert into items VALUES (1, 'fish'), (2, 'frog')
insert into @animal VALUES ('fish'), ('frog'), ('fish')

SELECT * FROM items i
inner join @animal a on i.item_names = a.animal_name

答案 1 :(得分:0)

就我个人而言,我认为在没有临时表的情况下这样做非常草率,但您可以执行以下操作:

select i.*
from (  select 'fish' animal union all
        select 'frog' union all
        select 'fish' 
    ) gen
    left join items i on i.item_name = gen.animal

生成一个" select"而不是生成一个字符串列表。 +"联合所有"对于动物的每次迭代。

希望有所帮助。

答案 2 :(得分:0)

如果IN子句是动态构建的,您可以尝试以下方法:

For each animal[i] in list 
   query = "SELECT * FROM ITEMS WHERE item_name = '"+animal[i]+"'"
   If i != list.length
       query += "UNION ALL"
End For

这是一种草率的方式,但它应该可以胜任。