如何找到对这些关系没有约束的表格中的关系?

时间:2014-05-13 22:08:23

标签: sql sql-server

我有一个包含很多表的数据库(644),并且它们都没有“系统”关系或约束,它们之间存在关系,因为这些值相互匹配。当他们创建表时,他们从不设置约束或关系。我甚至无法得到ERD模型,因为表之间没有“系统”关系,只有匹配的值关系。

问题是某些表有关系,因为它们具有相同的值,但列的名称没有任何相似的名称来理解关系。

例如,有一个名为table1.laborcode的列,它与table2.personid有关系。

我认为可能有一个SQL查询或代码可以执行并查找所有表之间的所有匹配值。

例如,在这里我只知道这两个表与匹配值有关系:

table1.laborcode = 123
table2.personid = 123

如果您对此问题有任何疑问:您可以问我,我会回答。

2 个答案:

答案 0 :(得分:1)

  • 是否存在维护数据的现有应用程序?

  • 是否存在查询数据的现有报告系统?

  • 是否有用户进行临时查询?

  • 您可以询问专家用户/维护者。

逆向工程任何/所有这些可能是您的最佳选择。

答案 1 :(得分:1)

我认为这需要大量的手工工作。您必须构建自己的ERD。也许您可以使用这样的查询来查找哪些列值得检查:

select table1, c1.name as name1, table2, c2.name as name2
from (select t.name as table1, c.* 
      from sys.columns as c
      inner join sys.tables as t
      on t.OBJECT_ID = c.OBJECT_ID) as c1
inner join (select t.name as table2 , c.* 
      from sys.columns as c
      inner join sys.tables as t
      on t.OBJECT_ID = c.OBJECT_ID) as c2
on  c1.object_id <> c2.object_id
and c1.SYSTEM_TYPE_ID = c2.SYSTEM_TYPE_ID
and c1.USER_TYPE_ID = c2.USER_TYPE_ID
and c1.MAX_LENGTH = c2.MAX_LENGTH
and c1.PRECISION = c2.PRECISION
and c1.SCALE = c2.SCALE
order by 1,2,3,4;

然后运行另一个查询以检查一列中的数据是否是另一列中的数据的子集。

select count(*) as result
from sampleA 
where colA1 not in (
  select colB1
  from sampleB
  )
union all
select count(*) as result
from sampleB 
where colB1 not in (
  select colA1
  from sampleA
  )
;

如果两个数字都不为零,则它不能是FK,但如果其中一个或两个都为零,则有可能。然后,您需要检查每个表中的行数以提高您的信心。