为什么 SQL 抱怨对连接键的引用不明确?

Why does SQL complain that a reference to a join key is ambiguous?

为什么在下面的代码中 Vertica return 会出现一个 zip3 不明确的错误?由于它用作左连接的键,因此两个表必须相等。

SELECT zip, zip3, city, zip3_name
FROM zip_codes
LEFT JOIN zip3_codes
USING (zip3);

这会产生以下错误:

Query 1 ERROR: ERROR:  Column reference "zip3" is ambiguous
DETAIL:  Reference "zip3" could refer to either "public.zip_codes.zip3" or "public.zip3_codes.zip3"

我可以通过选择 zip.zip3zip3.zip3COALESCE(zip.zip3, zip3.zip3) 来解决这个问题,但我很好奇为什么这是必要的。

虽然乍一看似乎列必须始终相同,但事实并非如此。 JOIN 实际上是一个 LEFT JOIN,其中 returns 第一个 table 中的所有行和第二个中的所有可能匹配项,当存在时给出 NULLs没有匹配项。

来自 zip_codes 的不匹配记录将导致 zip.zip3zip3.zip3 中的不同值,正好是第一个给出值,第二个是 NULL,所以它不是在这种特殊情况下实际上等同于交换那些,您需要确定您需要 table 的哪些列,并消除其 table 名称的歧义。

此外,即使不是这种情况,错误仍然会弹出。如果我们将您的 LEFT JOIN 更改为 INNER JOIN,您的假设是正确的并且列将始终具有相同的值,但您仍然会得到完全相同的错误。

原因是 SQL 分析器不够聪明,无法实现值始终相同。按照标准,如果您的查询引用来自不同 table 的同名列,您 必须 指定它来自哪个 table。没有进一步尝试解决歧义。