如何查找其他表对特定行的所有引用?

问题描述 投票:0回答:3

所以我有一个在其他各种表之间共享的地址表,例如学校、公园、教堂等。学校、公园等都是地址中一行的外键。

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

SELECT * FROM schools WHERE address_id = 1

但这意味着我必须知道第一行中的地址与学校相关。 但如果我不知道怎么办?它可能是其他 10 张桌子中的一张......

sql postgresql
3个回答
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
  ...

这样您只需运行一个查询即可将结果作为您使用的单个数据集返回。

如果您有一个表列表(或一个表组成的表),您可以通过编程方式生成查询——这样您就不必在表更改时更新查询。


3
投票

您正在寻找的 - 假设您有一个符合 ISO 标准的 RDBMS - 是 INFORMATION_SCHEMA 表集(实际上是视图集,但是嘿)。

您可以像这样找到依赖表:

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

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


0
投票

根据 Fritz H 的回答,以下内容适用于 SQL Server

SELECT
      cons.CONSTRAINT_NAME 'ConstraintName',
      keys.TABLE_NAME 'PKTable',
      keys.COLUMN_NAME 'PKColumn',
      cols.TABLE_NAME 'FKTable',
      cols.COLUMN_NAME 'FKColumn'
FROM
      INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS 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
© www.soinside.com 2019 - 2024. All rights reserved.