【问题标题】:How do I find all references from other tables to a specific row?如何找到从其他表到特定行的所有引用?
【发布时间】:2009-02-17 19:05:36
【问题描述】:

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

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

SELECT * FROM schools WHERE address_id = 1

但这意味着我必须知道第 1 行中的地址与一所学校相连。但是如果我不知道呢?它可能是其他 10 个表中的 1 个......

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

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

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

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

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

    【讨论】:

    • +1 建议使用 UNION ALL,因为 SQL 不会尝试删除重复项
    • UNION ALL 更快吗? (我不是在流鼻涕——我其实不知道。)
    【解决方案2】:

    您正在寻找的 - 假设您有一个符合 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
    

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

    【讨论】:

      猜你喜欢
      • 2021-11-19
      • 1970-01-01
      • 1970-01-01
      • 2012-07-31
      • 1970-01-01
      • 1970-01-01
      • 2012-05-17
      • 1970-01-01
      • 2022-10-13
      相关资源
      最近更新 更多