Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.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
类web结构的SQL查询递归_Sql_Sql Server_Recursion - Fatal编程技术网

类web结构的SQL查询递归

类web结构的SQL查询递归,sql,sql-server,recursion,Sql,Sql Server,Recursion,我这里有一张桌子,叫富。数据是这样设置的 ID TableReference DataId0 DataId1 DataId2 -- -------------- ------- ------- ------- 1 Prize 3 4 5 2 Prize 4 5 NULL

我这里有一张桌子,叫富。数据是这样设置的

ID     TableReference     DataId0     DataId1     DataId2
--     --------------     -------     -------     -------
 1     Prize                   3           4           5
 2     Prize                   4           5        NULL
 3     Cash                    1        NULL        NULL
 4     Prize                   8        NULL          12
 5     Foo                     2           3        NULL
 6     Cash                    8           1          10
 7     Foo                     5           1           2
等等。我知道数据设置得很糟糕,但我没有这样设置我只是在处理后遗症

我正试图想出一种基本上把桌子弄平的方法;也就是说,将所有数据显示到表Foo不引用自身的点。我试图找出一个sql查询,我可以做得到

通常,当我处理递归时,我拥有或可以建立父ID并以这种方式进行设置,但是对于这个表,似乎有多个子ID和父ID创建了一个类似web的结构,而不是层次结构。因此,我甚至不知道从哪里开始为这样的东西编写sql查询

ID     TableReference     DataId0     DataId1     DataId2
--     --------------     -------     -------     -------
 1     Prize                   3           4           5
 2     Prize                   4           5        NULL
 3     Cash                    1        NULL        NULL
 4     Prize                   8        NULL          12
 5     Foo                     2           3        NULL
 6     Cash                    8           1          10
 7     Foo                     5           1           2
注意:没有一个Foo指向另一个Foo的无限循环,而另一个Foo指向我发现的原始Foo


使用t-sql。如果可能的话,感谢您的帮助。

第一步是显示基础表的规范化视图。请给出此模式:

create table dbo.foo
(
  id             int         not null primary key clustered ,
  TableReference varchar(64) not null ,
  DataId0        int         not null ,
  DataId1        int             null ,
  DataId2        int             null ,
)
你可以这样说:

with normalized_view as
(
        select id = id , TableReference = TableReference , DataId = DataId0 from dbo.foo
  union select id = id , TableReference = TableReference , DataId = DataId1 from dbo.foo
  union select id = id , TableReference = TableReference , DataId = DataId2 from dbo.foo 
)
select *
from normalized_view nv

如果不知道DataId[0-2]引用的是什么,就很难再进一步了。

删除了mysql标记,因为这与mysql无关。我不明白你想说什么。是否只想显示三个数字列替换为等效表参考值的数据?无限循环1->3->1?正确。问题是表Foo可以引用自身,可能多次Foo entry指向Foo entry,Foo entry指向另一个Foo条目。dataId[0-2]引用其他数据库表,包括Foo本身。然后您应该能够从我给您的内容出发,编写一个正常的递归联合。我想如果所有其他表都添加到normalized_视图中,它就会起作用。如果您只需要不指向“Foo”的引用,您可以将规范化的_视图与其自身连接起来,并在WHERE子句中过滤掉自引用。是的,这是有效的。有趣的是,有时候所有的事情都是从不同的角度来看的。只需展平表本身,并在必要时执行递归联接,同时将原始主ID保留在select中。谢谢大家!