Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关于多连接语法SQL/NoSQL的澄清_Sql_Sql Server_Join_Relationship_Nosql - Fatal编程技术网

关于多连接语法SQL/NoSQL的澄清

关于多连接语法SQL/NoSQL的澄清,sql,sql-server,join,relationship,nosql,Sql,Sql Server,Join,Relationship,Nosql,我正在研究NoSQL数据库,遇到了一种情况,它显示了在关系数据库中存储连接数据的复杂性。以下是表格结构: 这两个问题是: 谁是鲍勃的朋友: SELECT p1.Person FROM Person p1 JOIN PersonFriend ON PersonFriend.FriendID = p1.ID JOIN Person p2 ON PersonFriend.PersonID = p2.ID WHERE p2.PERSON = 'Bob' 谁是鲍勃的朋友 SELECT p1.Perso

我正在研究NoSQL数据库,遇到了一种情况,它显示了在关系数据库中存储连接数据的复杂性。以下是表格结构:

这两个问题是:

谁是鲍勃的朋友:

SELECT p1.Person
FROM Person p1 JOIN PersonFriend
ON PersonFriend.FriendID = p1.ID
JOIN Person p2
ON PersonFriend.PersonID = p2.ID
WHERE p2.PERSON = 'Bob'
谁是鲍勃的朋友

SELECT p1.Person
FROM Person p1 JOIN PersonFriend
ON PersonFriend.PersonID = p1.ID
JOIN Person p2
ON PersonFriend.FriendID = p2.ID
WHERE p2.PERSON = 'Bob'
我想我非常理解join,但是我在理解给定需求的两个ON子句之间的联系时遇到了一些困难。这两个查询都是相同的

例如,考虑第一个查询:要获得Bob的朋友,我需要执行以下操作:

  • PersonFriend
    获取
    FriendID
    ,其中
    personID
    为2。这将提取Bob的朋友(personID为2的子句
    执行,其中p2.person=Bob
  • Person
    获取
    Person
    (姓名),其中人员的
    ID
    等于步骤1中返回的
    FriendID
  • 在第一个查询中,第一个(内部)联接根据Person(p1)的ID列和PersonFriend的FriendID列返回用于匹配行的派生表。但是,我在查询的第二个连接中迷失了方向

    第二个查询让我更加困惑,其中PersonFriend上join
    的语法与第一个查询相反。我的意思是,我可以理解查询“谁是Bob的朋友”是“谁是Bob的朋友”的反义词,但我无法用SQL查询来可视化这种关系


    任何帮助都将不胜感激

    PersonFriend
    表格应该告诉我:这个
    PersonID
    有这个
    FriendID
    朋友。否则就有问题了。如果这个条件是正确的,那么您的查询是好的

    你基本上只是在说:

    第一个问题:

    从表
    Person p1
    中获取这些行,其中表
    PersonFriend
    中的列
    FriendID
    等于
    p1.ID
    (所有匹配),而表
    PersonFriend
    中的列
    PersonID
    仅等于
    Person p2
    Person

    因此,您只能从
    PersonFriend
    中获得这些行,其中
    'Bob'
    作为
    PersonID

    当您将
    'Bob'
    设置为
    FriendID
    ,而不是
    PersonID
    时,您显然得到了所有与
    'Bob'
    匹配的
    FriendID


    我希望您现在能理解:)

    但是PersonFriend会将所有友谊存储两次。。。为什么?我不知道你是什么意思?你指的是PersonFriend中的前两行,它有1和2,然后是2和1?这是因为第一行表示2是1的朋友,第二行表示1是2的朋友。或者我想是这样,没错。p1可以和p2成为朋友,但p2不能和p1成为朋友吗?是的,例如:99(扎克)是2(鲍勃的)朋友,但2不是99的朋友。我只是很难将其转换为连接条件!但这正是查询的编写方式。。。那有什么问题