是否可以为 PostgreSQL 数据库编写/制作模式,然后查询让我们说
SELECT email, username, city_population
FROM users, cities
WHERE email = 'user@example.com'
用户表和城市表之间的连接是在其他地方定义的,PostgreSQL 使用该信息来连接表。有没有类似的东西?
编辑:没有意见
是否可以为 PostgreSQL 数据库编写/制作模式,然后查询让我们说
SELECT email, username, city_population
FROM users, cities
WHERE email = 'user@example.com'
用户表和城市表之间的连接是在其他地方定义的,PostgreSQL 使用该信息来连接表。有没有类似的东西?
编辑:没有意见
有NATURAL JOIN
,但要使其工作,列必须具有相同的名称。换句话说,这将起作用:
CREATE TABLE cities (
city_id SERIAL PRIMARY KEY,
city_population INTEGER,
...
);
CREATE TABLE users (
username VARCHAR PRIMARY KEY,
city_id INTEGER REFERENCES cities,
...
);
SELECT email, username, city_population
FROM users
NATURAL JOIN cities
WHERE email = 'user@example.com';
威尔的观点解决方案更好,可能更接近你应该想要的,但我认为这更接近你的问题。
所以你想从联合表中得到结果,只是没有定义如何加入它们?
答案是不。显然,您必须以某种方式加入他们,并且由于有很多可能的方式,您必须定义如何。
NATURAL JOIN
可能是你所说的下一个最好的事情。请参阅@Daniel 的答案。
标准 SQL 中的另一个语法快捷方式是USING
从句。使用它,您可以定义要连接表的列列表。列名在两边都必须是唯一的。
SELECT u.email, u.username, c.city_population
FROM users u
JOIN cities c USING (city_id)
WHERE u.email = 'user@example.com'
我还为您原本可能不明确的查询添加了表格限定条件。
不,NATURAL JOIN
Daniel 所描述的和 SQL 一样接近。这是有原因的。虽然人们经常希望基于同一域中列的相等性来加入,但他们有时想要更复杂的东西。我看到很多查询询问诸如“谁住在离这个城市 300 英里范围内的城市?”、“离该用户最近的 3 个城市是什么,不包括他们居住的城市?”或“什么城市?”其他用户与该用户生活在同一状态?” 基于一些假设的连接标准的自动连接将使编写明确的查询来回答这样的问题变得更加困难。
也就是说,想要您正在寻找的东西并不少见,因此正如 Craig 所说,有许多工具使用外键定义来提供默认链接。
基于这个问题,我怀疑您可能对HTSQL感兴趣,它提供自动链接和其他便利功能,以帮助弥合关系数据库与人们可能已经知道的其他格式之间的差距。它的发展部分由基金会资助,包括国家科学基金会。(除了阅读文档,并在会议上与其中一位作者进行了简短交谈外,我与该项目没有任何关系。)