Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.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
Oracle SQL如何编写SQL语句来验证我的网络中的用户(即朋友或朋友的朋友)是否_Sql_Oracle_Social Networking - Fatal编程技术网

Oracle SQL如何编写SQL语句来验证我的网络中的用户(即朋友或朋友的朋友)是否

Oracle SQL如何编写SQL语句来验证我的网络中的用户(即朋友或朋友的朋友)是否,sql,oracle,social-networking,Sql,Oracle,Social Networking,我有这个问题。给定一个用户表,该表由社交网络中的用户用户名和包含用户名和用户名的好友表组成,如下所示 username friendname John Thomas Chris James 。。。我正在尝试编写一个SQL语句,如果用户在我的网络中,该语句将运行。换句话说 该用户是朋友还是朋友的朋友 我一直在绕着这个问题转,只能提出以下问题: SELECT f2.username, f2.friendname FROM friends f2 WHERE f2.us

我有这个问题。给定一个用户表,该表由社交网络中的用户用户名和包含用户名和用户名的好友表组成,如下所示

username friendname

John        Thomas
Chris       James
。。。我正在尝试编写一个SQL语句,如果用户在我的网络中,该语句将运行。换句话说 该用户是朋友还是朋友的朋友

我一直在绕着这个问题转,只能提出以下问题:

SELECT f2.username, f2.friendname 
FROM friends f2 
WHERE f2.username IN (
      SELECT f1.friendname 
      FROM friends f1 
      WHERE f1.username = 'Thomas') 
AND f2.friendname <> 'user1' 
AND f2.friendname = 'user2';    
它基本上检查用户是否是我朋友的朋友,即如果为false,则返回null

试着弄清楚我如何扩展我的朋友网络。我的意思不仅仅是我朋友的朋友

SELECT  *
FROM    (
        SELECT  username
        FROM    friends
        START WITH
                username = 'myname'
        CONNECT BY
                friendname = PRIOR username
                AND level <= 3
        )
WHERE   username = 'friendname'
        AND rownum = 1
如果对表进行非规范化:每个友谊存储两条记录,则可以更快地执行此查询,如下所示:

CREATE TABLE dual_friends (orestes NOT NULL, pylades NOT NULL, CONSTRAINT pk_dualfriends_op PRIMARY KEY (orestes, pylades)) ORGANIZATION INDEX
AS
SELECT  username, friendname
FROM    friends
UNION ALL
SELECT  friendname, username
        FROM    friends
然后,您只需将上面的CTE替换为双_friends:


,它将使用索引,而且效率更高,特别是如果您将级别限制在某个合理的值内。

您可以使用

但是oracle使用connect by进行分层查询,因此将对您进行级别搜索sql似乎对我有效。好的,假设给定这个表用户名friendname Thomas Alice Bob Bob Jo,运行myname=Thomas和friendname='Jo'的sql,不提供任何信息,表明Jo不在Thomas网络中,这是incorrect@user你的友谊是对称的吗?也就是说,如果爱丽丝是托马斯的朋友,托马斯也是爱丽丝的朋友吗?我相信他是,但最好指定它。@Quassnoi,是否要在此示例表用户名friendname Thomas Alice Bob Jo上尝试查询它似乎没有返回任何内容,不确定是否返回me@Quassnoi,事实上,我使用了你之前的一些建议和调整加谷歌搜索,成功地让它运行起来。但是这个新的比它强,看起来我还有很多东西要学。谢谢你所做的一切
CREATE TABLE dual_friends (orestes NOT NULL, pylades NOT NULL, CONSTRAINT pk_dualfriends_op PRIMARY KEY (orestes, pylades)) ORGANIZATION INDEX
AS
SELECT  username, friendname
FROM    friends
UNION ALL
SELECT  friendname, username
        FROM    friends
WITH    f AS
        (
        SELECT  pylades, level
        FROM    dual_friends
        START WITH
                orestes  = 'Thomas'
        CONNECT BY NOCYCLE
                orestes = PRIOR pylades
                AND level <= 3
        )
SELECT  *
FROM    f
WHERE   pylades = 'Jo'
        AND rownum = 1