SELECT users.id
FROM orders, users, "userEmailCollections", "reviewTracks", "loyaltyCampaignRedemptions"
WHERE (orders."restaurantTableId" IN (12,7,9,8,10,11,14,99,100,6)
AND users.id = orders."orderUserId")
OR ("userEmailCollections"."restaurantId" = 6
AND "userEmailCollections"."userId" = users.id)
OR ("reviewTracks"."restaurantId" = 6
AND users.email = "reviewTracks"."email")
OR ("loyaltyCampaignRedemptions"."restaurantId" = 6
AND "users".id = "loyaltyCampaignRedemptions"."userId");
我尝试运行上面的查询,以获取与任何其他表有关系的用户的所有用户ID-例如,如果用户有order
或userEmailCollection
,我希望他们的ID显示在查询输出中。
但是,这个查询挂起而没有产生响应,我不知道为什么。
3条答案
按热度按时间qojgxg4l1#
我会说查询可以看起来像这样
b5lpy0ml2#
没有理由连接表,因为查询是关于关联的存在而不是关联的属性。下面的查询应该在合理的时间内返回所需的结果:
DISTINCT包含在子查询中,以便在关联表中存在大量重复的用户ID或电子邮件时提高性能。由于这些是包含测试,因此不使用DISTINCT不会更改结果集。
oknwwptz3#
回应上面的评论....在join语法中显式,并将查询分解为更小的子查询。这将有助于数据库生成更有效的执行计划。例如:
这里的each cte连接两个表,并在特定条件下过滤,而不是笛卡尔连接。使用distinct将有助于从结果集中删除重复的行。它也更容易阅读和理解。