对于我的家庭作业,我必须从有关世界的信息数据库中编写查询。我的一个查询中出现错误,我无法弄清楚原因。我遇到问题的查询的问题陈述是:
Find all official languages, the country for which it is spoken, and the percentage of speakers
(percentage of speakers is calculated as percentage spoken times country population divided by 100).
Order results by the total number of speakers with the most popular language first. (238 results)
我尝试从网站运行查询时收到的错误是:
Query failed: ERROR: missing FROM-clause entry for table "city" LINE 1: ...kers FROM lab2.country AS
co JOIN lab2.country ON lab2.city.... ^
我为查询编写的代码是:
case 11:
$q = "SELECT name, language, ((pecentage * population)/100) AS
percentage_of_speakers FROM lab2.country AS co JOIN lab2.country ON lab2.city.country_code WHERE
(is_official IS TRUE) ORDER BY percentage_of_speakers DESC";
$result = pg_query($q) or die ('Query failed: '. pg_last_error());
break;
我为此查询获取的信息来自两个不同的表而不是一个。我相信我必须使用JOIN语句才能从两个表中获取数据。以下是正在使用的2个表。感谢您的帮助。
Table "lab2.country_language"
Column | Type | Modifiers
--------------+-----------------------+----------------------------------------
country_code | character(3) | not null default ''::bpchar
language | character varying(30) | not null default ''::character varying
is_official | boolean | not null default false
percentage | real | not null default 0::real
Table "lab2.country"
Column | Type | Modifiers
-----------------+-----------------------+--------------------------------------
country_code | character(3) | not null default ''::bpchar
name | character varying(52) | not null default ''::character varying
continent | continent | not null
region | character varying(26) | not null default ''::character varying
surface_area | real | not null default 0::real
indep_year | smallint |
population | integer | not null default 0
答案 0 :(得分:1)
我重新格式化了您的查询,以便我可以阅读,但我没有解决问题。以下是更好格式化的外观:
SELECT
name,
language,
((pecentage * population)/100) AS percentage_of_speakers
FROM lab2.country AS co
JOIN lab2.country ON lab2.city.country_code
WHERE is_official
ORDER BY percentage_of_speakers DESC
查询中的问题是以下两个突出显示的部分:
FROM lab2.country AS co
JOIN lab2.country ON lab2.city.country_code
^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^
第一个问题是您尝试将lab2.country
加入其自身(lab2.country AS co JOIN lab2.country
)。您实际上已经允许在SQL中执行此操作,并且它有时非常有用,但它不是您需要的。您需要将lab2.country
加入lab2.city
。
更大的问题是您的加入中的ON
表达式。你不能加入这样的价值。 连接谓词(调用ON
关键字后的部分)必须是表达式,其值为布尔值(即是真还是假)。它将两个表链接在一起。
要了解如何解决这个问题,我建议您研究PostgreSQL tutorial on joins。链接教程使用PostgreSQL教程中的示例表(这些不是您的问题中的表)提供了一个如何工作的示例:
SELECT *
FROM weather INNER JOIN cities ON (weather.city = cities.name);
了解(weather.city = cities.name)
如何提供一种"测试"可以为每个行组合运行的表达式,以查看它们是否匹配?
希望能够解释联接的工作原理,以便了解如何修复原始查询。
(顺便说一句,我强烈建议您习惯使用psql
或PgAdmin-III等工具以交互方式测试代码。它们比基于随机网页的查询工具更方便,而且经常提供更好的错误消息。)