因此,我有一个地址表,它可以在各种其他表格中共享,例如学校,公园,教堂等。学校,公园等所有外键都在一行地址中。如何从其他表中找到所有对特定行的引用?
我想知道的是,如果我在地址表中有特定的行,是否有办法找出哪个表指向哪个行。所以基本上只是这样的:
SELECT * FROM schools WHERE address_id = 1
但那就意味着我必须要知道,在第1行的地址连接到一所学校。但是如果我不知道呢?它可能是其他10个表中的一个...
因此,我有一个地址表,它可以在各种其他表格中共享,例如学校,公园,教堂等。学校,公园等所有外键都在一行地址中。如何从其他表中找到所有对特定行的引用?
我想知道的是,如果我在地址表中有特定的行,是否有办法找出哪个表指向哪个行。所以基本上只是这样的:
SELECT * FROM schools WHERE address_id = 1
但那就意味着我必须要知道,在第1行的地址连接到一所学校。但是如果我不知道呢?它可能是其他10个表中的一个...
您将不得不查询每个其他表。
我会做它作为一个UNION查询:
SELECT id, "schools" as whichTable from schools where address_id=1
UNION
SELECT id, "parks" as whichTable from parks where address_id=1
UNION
...
,这样你只需要运行一个查询并取回,将结果作为你一起工作的单一数据集。
如果您有一个表(或一个表的表)的列表,您可以编程生成查询 - 这将节省您在表更改时不得不更新您的查询。
你在找什么 - 假设你有一个符合ISO标准的RDBMS-是INFORMATION_SCHEMA表(实际上是viewset,但是嘿)。
你可以找到相关的表像这样:
select
cons.CONSTRAINT_NAME 'ConstraintName',
keys.TABLE_NAME 'PKTable',
keys.COLUMN_NAME 'PKColumn',
cols.TABLE_NAME 'FKTable',
cols.COLUMN_NAME 'FKColumn'
from INFORMATION_SCHEMA.REFERENTI cons
join INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE cols on cols.CONSTRAINT_NAME = cons.CONSTRAINT_NAME
join INFORMATION_SCHEMA.KEY_COLUMN_USAGE keys on keys.CONSTRAINT_NAME = cons.UNIQUE_CONSTRAINT_NAME
注:这是一个非常粗糙的,未经测试的查询。不过,你明白了。
+1建议使用UNION ALL,因为不会有SQL重复尝试删除 – Kristen 2009-02-17 19:26:40