类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中。谢谢大家!