2009-02-17 58 views
0

因此,我有一个地址表,它可以在各种其他表格中共享,例如学校,公园,教堂等。学校,公园等所有外键都在一行地址中。如何从其他表中找到所有对特定行的引用?

我想知道的是,如果我在地址表中有特定的行,是否有办法找出哪个表指向哪个行。所以基本上只是这样的:

SELECT * FROM schools WHERE address_id = 1 

但那就意味着我必须要知道,在第1行的地址连接到一所学校。但是如果我不知道呢?它可能是其他10个表中的一个...

回答

5

您将不得不查询每个其他表。

我会做它作为一个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 
    ... 

,这样你只需要运行一个查询并取回,将结果作为你一起工作的单一数据集。

如果您有一个表(或一个表的表)的列表,您可以编程生成查询 - 这将节省您在表更改时不得不更新您的查询。

+0

+1建议使用UNION ALL,因为不会有SQL重复尝试删除 – Kristen 2009-02-17 19:26:40

2

你在找什么 - 假设你有一个符合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 

注:这是一个非常粗糙的,未经测试的查询。不过,你明白了。

相关问题