在一般情况下,我认为您不能指望 TableA.Id 来暗示对 TableA 的外键引用。它可能指的是一个不同的表,该表也存储了表 A 中的 id 号。我知道您已经查看了此特定案例中的代码,但您正在寻找一种不需要查看代码的解决方案。
反正 。. .
您可以在表达式上连接表。此查询(PostgreSQL 语法)将列名的一部分连接到表名。在 PostgreSQL 中,函数调用left(t1.column_name, -2)
返回除了 t1.column_name 的最后两个字符之外的所有字符;left(t1.column_name, -3)
返回除最后三个之外的所有内容。这旨在匹配“TableAid”和“TableA_id”等名称。
select t1.table_catalog, t1.table_schema, t1.table_name,
t1.column_name, left(t1.column_name, -2),
t2.table_catalog, t2.table_schema, t2.table_name
from information_schema.columns t1
inner join information_schema.tables t2
on left(t1.column_name, -2) = t2.table_name or
left(t1.column_name, -3) = t2.table_name
where t1.column_name like '%id';
我相信这个查询会返回相同的行。它使用 SQL Server 语法,但我没有在 SQL Server 中对其进行测试。
select t1.table_catalog, t1.table_schema, t1.table_name,
t1.column_name, left(t1.column_name, length(t1.column_name) - 2),
t2.table_catalog, t2.table_schema, t2.table_name
from information_schema.columns t1
inner join information_schema.tables t2
on left(t1.column_name, length(t1.column_name) - 2) = t2.table_name or
left(t1.column_name, length(t1.column_name) - 3) = t2.table_name
where t1.column_name like '%id';
这两个都可能错误地返回行,主要是因为连接可能至少需要考虑“table_catalog”列。我争论是否将其包括在内。我终于决定不放了。我认为,如果我站在你的立场上,我希望这个查询有最大的机会返回一些令人惊讶的行。