This question was migrated来自数据库管理员堆栈交换,因为它可以在堆栈溢出时得到响应。
Migrated去年。
我尝试运行一个简单的代码,如下所示:
Create Table weather (
    city        varchar(80),
    temp_lo     int,
    temp_hi     int,
    prcp        real,
    date        date
);
Insert Into weather Values ('A', -5, 40, 25, '2018-01-10');
Insert Into weather Values ('B', 5, 45, 15, '2018-02-10');

Create Table cities (
    city        varchar(80),
    location    point
);
Insert Into cities Values ('A', '(12,10)');
Insert Into cities Values ('B', '(6,4)');
Insert Into cities Values ('C', '(18,13)');

Select * From cities, weather Where city = 'A'

但我得到的是
错误:列引用“city”不明确。
我的代码怎么了?

最佳答案

如果我是你,我会用稍微不同的方式来建模。
为了使事情正常化一点,我们将从cities表开始进行一些更改:

create table cities (
    city_id     integer primary key,
    city_name   varchar(100),
    location    point
);

注意,我使用了一个整数来表示表的ID和主键,并分别存储了城市的名称。这为您提供了一个易于维护的查找表。通过使用一个整数作为主键,我们在存储数据时还将在天气表中使用较少的空间。
Create Table weather (
    city_id     integer,
    temp_lo     int,
    temp_hi     int,
    prcp        real,
    record_date  date
);

请注意,我存储的是城市的id,而不是名称。另外,我已经重命名了date,因为用SQL reserved words命名列不是一个好主意。
确保我们在测试数据中使用id:
Insert Into weather Values (1, -5, 40, 25, '2018-01-10');
Insert Into weather Values (2, 5, 45, 15, '2018-02-10');

Insert Into cities Values (1,'A', '(12,10)');
Insert Into cities Values (2,'B', '(6,4)');
Insert Into cities Values (3,'C', '(18,13)');

你以前的问题:
Select * From cities, weather Where city = 'A'

名称不明确,因为两个表都有一个city列,而且数据库引擎不知道您指的是哪个city(它不会自动知道是否需要使用cities.city或weather.city)。查询还执行cartesian product,因为您尚未将表连接在一起。
使用我在上面所做的更改,您需要如下内容:
Select *
From cities, weather
Where cities.city_id = weather.city_id
and city_name = 'A';

或者,使用新的连接语法:
Select *
From cities
join weather on cities.city_id = weather.city_id
Where city_name = 'A';

这两个查询在功能上是等价的——现在大多数人更喜欢第二个查询,因为它可以防止错误(例如:忘记实际加入where子句)。

关于postgresql - 列引用含糊不清,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51754758/

10-16 14:56