gpt4 book ai didi

sql - 真的可以到处用JOINS代替SQL中的子查询吗

转载 作者:行者123 更新时间:2023-12-04 14:15:20 25 4
gpt4 key购买 nike

我听说有人说表连接可以在任何地方使用来代替子查询。我在查询中对其进行了测试,但发现只有在使用子查询时才会检索到适当的数据集。我无法使用连接获得相同的数据集。我不确定我的发现是否正确,因为我是 RDBMS 的新手,因此经验不足。我将尝试绘制我正在试验的数据库的模式(用文字表示):

数据库有两个表:
Users ( ID , 姓名, 城市) 和友谊 ( ID , Friend_ID )
Goal :Users表用于存储简单的用户数据,Friendship表代表用户之间的友谊。 Friendship 表有两个列作为外键,引用 Users.ID。表之间存在多对多关系。

问题:我必须检索所有用户的 Users.ID 和 Users.Name,这些用户不是特定用户 x 的 friend ,而是来自同一个城市(很像 fb 的好友推荐系统)。

通过使用子查询,我能够实现这一点。查询看起来像:

SELECT ID, NAME 
FROM USERS AS U
WHERE U.ID NOT IN (SELECT FRIENDS_ID
FROM FRIENDSHIP,
USERS
WHERE USERS.ID = FRIENDSHIP.ID AND USERS.ID = x)
AND U.ID != x AND CITY LIKE '% A_CITY%';

示例条目:
Users

Id = 1 Name = Jon City = 孟买

Id=2 Name=Doe City=孟买

Id=3 名称=阿伦市=孟买

Id=4 名称=普拉卡什市=德里
Friendship

Id= 1 Friends_Id = 2

Id = 2 Friends_Id=1

Id = 2 Friends_Id = 3

Id = 3 Friends_Id = 2

我可以通过执行连接在单个查询中获取相同的数据集吗?如何?如果我的问题不清楚,请告诉我。谢谢。

注意:我通过指定两个表在子查询中使用内部联接:Friendship、Users。省略 Users 表并从外部使用 U 会产生错误(但如果不为表 Users 使用别名,查询在语法上没有问题,但此查询的结果包括 ID 和用户名,他们有多个 friend ,包括用户具有 ID x。有趣,但不是问题的主题)。

最佳答案

对于 not in您可以使用 left join并检查 is null :

select u.id, u.name 
from Users u
left join Friends f on u.id = f.id and f.friend_id = @person
where u.city like '%city%' and f.friend_id is null and u.id <> @person;

在某些情况下,您无法仅通过内部/左/右连接来解决问题,但您的情况不是其中之一。

请检查sql fiddle : http://sqlfiddle.com/#!9/1c5b1/14

还有关于您的注意事项:您尝试做的事情可以通过 lateral 实现。加入或 cross apply取决于您使用的引擎。

关于sql - 真的可以到处用JOINS代替SQL中的子查询吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34914403/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com