【问题标题】:FIND all tables I need to join to get relationship between two tables查找我需要加入的所有表以获取两个表之间的关系
【发布时间】:2016-12-03 19:25:27
【问题描述】:

我正在使用 SQL Server 2012。我想加入两个没有列的表,我可以加入它们,我怎样才能找到所有表来访问这两个表?

例如:我需要将Table A 连接到table D,为此我需要将A 连接到B,然后连接到C,最后连接到D

我的问题是:我可以在数据库的数千个表中找到表BC而不逐表搜索吗?

非常感谢, 呵呵

【问题讨论】:

  • 添加一些示例表数据,以及预期的结果。 (对于所有 1000 张桌子......可能是设计问题!)
  • 两个任意表之间完全有可能(通常)有多个外键和路径。所以没有办法找到表之间的“路径”。

标签: sql sql-server join sql-server-2012


【解决方案1】:

假设:

  1. 您希望自动执行此过程
  2. 您有可以依赖的 FOREIGN KEY 约束

您应该按照以下步骤进行:

  1. 查询 sys.foreign_keys 并创建一个包含表之间链接的有向图结构。
  2. 然后实现一个图搜索算法,该算法将从表 A 开始并尝试找到到表 D 和从 D 到 A 的路径。
  3. 一旦找到路径,就很容易构建包含路径上所有表连接的动态 SQL。您还需要查询 sys.foreign_key_columns 才能构造 JOIN 的 ON 子句。

如果您需要更多细节方面的帮助,请告诉我。

【讨论】:

    【解决方案2】:

    您可以做一些事情来帮助您的事业,但在大多数情况下,没有直接的方法,您需要了解数据库的结构和表格的用途。此外,根据数据库的设计,您可能很难直观地找到答案,您可能只需要从熟悉数据库设计的人那里获得指导。无论如何:

    表 A 和 D 中的字段: 您可以查看表中的主要字段或唯一字段,以确定哪些其他表可能链接到这些表。通常它们的命名方式与其他表匹配,您可以知道它们来自哪个表。

    Information_Schema 视图 您可以使用 information_schema.tables 和 information_schema.column 视图轻松搜索整个数据库中的表名和列名,并将搜索范围缩小到更少的表。

    【讨论】:

    • “我不知道怎么做”比“没有办法做这个”更安全……因为很多时候有办法,你就是不这样做碰巧知道它! :)
    猜你喜欢
    • 2014-10-20
    • 1970-01-01
    • 1970-01-01
    • 2020-01-13
    • 1970-01-01
    • 2014-01-18
    • 2016-06-27
    • 2017-07-31
    • 1970-01-01
    相关资源
    最近更新 更多