运行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实现这一目标 - 但是如果这不太可能,那么其他答案都非常受欢迎。
答案 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
这是一种草率的方式,但它应该可以胜任。