【问题标题】:SQL Server: find relations between tables without Foreign Key constraintsSQL Server:查找没有外键约束的表之间的关系
【发布时间】:2015-07-07 17:45:52
【问题描述】:

我有一个 SQL Server 数据库,其中包含许多表(数百个),它们以某种方式相互关联。它们都有主键 (GUID),但实际上只有少数定义了外键约束。

我需要在任何列上找到与某个表(我们称之为 TargetTable)直接相关和非直接相关(通过 1、2 个或更多中间表)相关的所有表。

我的最终目标是获取 SQL 查询(每个相关表一个),它连接 TargetTable 和该相关表之间的所有表。

例如:找到5个与TargetTable相关的表:

  • 目标表 - 表 1
  • 目标表 - 表 1 - 表 2
  • TargetTable - Table3
  • 目标表 - 表 3 - 表 4
  • 目标表 - 表 3 - 表 4 - 表 5

我需要获得 5 个单独的 JOIN。

是否有任何 SQL 查询或软件或实用程序或任何方式来获得所需的 SQL 代码?甚至足以在一些方便的图表中获得关系,这样我就可以用我最喜欢的脚本语言解析它们并生成 SQL 代码。

【问题讨论】:

    标签: sql sql-server database foreign-keys relationship


    【解决方案1】:

    您当然可以通过遍历 information_schema.columns 或 sys.columns 来生成代码,但我怀疑这是否能如您所愿。

    如果他们不费心放入 FK,那么他们可能还做了一些其他糟糕的事情……比如没有标准命名约定或通用表。

    您最好查看数据库中的 SQL 查询/过程以查看大多数关系在哪里...然后您必须自己决定表是否相关。

    【讨论】:

    • 是的,缺少 FK 是一件坏事,但这个数据库是旧的遗产,我无法改变很多,我必须使用我拥有的东西。关于查询/程序,有没有办法在提到所需表的地方获取所有查询/程序?
    • 完全了解继承一个糟糕的设计.. 取决于 SQL Server 的版本,有多种方法。这应该是一个很好的起点。 msdn.microsoft.com/en-us/library/ms345522(v=SQL.90).aspx
    【解决方案2】:

    您可以使用 SQL Server Management Studio 两者兼得,用数据库图表绘制图表(不理想但很有用)https://www.mssqltips.com/sqlservertip/1816/getting-started-with-sql-server-database-diagrams/,您可以使用查询设计器获取 SQL 并加入(仍在 SSMS 中)https://www.mssqltips.com/sqlservertip/1086/sql-server-management-studio-query-designer/

    希望对您有所帮助,

    【讨论】:

    • 据我所知,内置 SQL Server 数据库图表只能看到定义了 FK 约束的关系。
    • 是的,你是对的,错过了“只有少数......”没有约束你会受苦,当然会做手工工作。 :)
    【解决方案3】:

    您不能仅根据表格推断关系。为此,您需要了解该领域。例如,假设您有两个表,T1 包含 int 字段 X 和 T2 包含 int 字段 Y。那么在 T1 和 T2 的行之间存在关系 R,其中 (r1,r2) 在 R当且仅当 r1.x = r2.y.

    因此,我建议您使用您的领域知识构建一个模型(例如 ER 模型)。然后手动添加外键约束。

    【讨论】:

      猜你喜欢
      • 2020-04-08
      • 1970-01-01
      • 2011-12-11
      • 2014-01-06
      • 1970-01-01
      • 2017-06-17
      • 2017-10-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多