首页 > 解决方案 > 在一个模式中找到所有可能的连接?

问题描述

我可以在一个模式中找到所有可能的连接吗?例如达到 2、3 和 4 级。

我可以做这样的事情:

*;with combination as (
 select distinct rn = DENSE_RANK() over (order by table_name), table_name from INFORMATION_SCHEMA.TABLES
)
select
 combination_no = ROW_NUMBER() Over (Order By NEWID()),
 c1.table_name, c2.table_name, c3.table_name, c4.TABLE_NAME
from combination c1, combination c2, combination c3, combination c4
where
 c1.rn < c2.rn and
 c2.rn < c3.rn and
 c3.rn < c4.rn
order by c1.rn, c2.rn, c3.rn, c4.rn

但是,这不是我的意思。我可以只在有连接的地方生成这些结果吗?

在此处输入图像描述

标签: sqlsql-servertsql

解决方案


感谢所有回复。我做了这样的事情:

 SELECT  obj.name AS FK_NAME,
    sch.name AS [schema_name],
    tab1.name AS tab,
    col1.name AS col,
    tab2.name AS [referenced_table],
    col2.name AS [referenced_column]
    into #temp
FROM sys.foreign_key_columns fkc
INNER JOIN sys.objects obj
    ON obj.object_id = fkc.constraint_object_id
INNER JOIN sys.tables tab1
    ON tab1.object_id = fkc.parent_object_id
INNER JOIN sys.schemas sch
    ON tab1.schema_id = sch.schema_id
INNER JOIN sys.columns col1
    ON col1.column_id = parent_column_id AND col1.object_id = tab1.object_id
INNER JOIN sys.tables tab2
    ON tab2.object_id = fkc.referenced_object_id
INNER JOIN sys.columns col2
    ON col2.column_id = referenced_column_id AND col2.object_id = tab2.object_id

之后我可以使用:

select 'Select  top 10 * from '+ tab+ ' join ' + referenced_table +' on ' + col + ' = ' + referenced_table+'.' +referenced_column
    from #temp

这给了我与其他表的所有可能连接,这就是我想要的。现在我还在想,当我想要在我的查询中加入 2 和 3 个联接(没有自联接)时,如何接收所有可能的联接。


推荐阅读