为什么 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.zip3
或 zip3.zip3
或 COALESCE(zip.zip3, zip3.zip3)
来解决这个问题,但我很好奇为什么这是必要的。
虽然乍一看似乎列必须始终相同,但事实并非如此。 JOIN
实际上是一个 LEFT JOIN
,其中 returns 第一个 table 中的所有行和第二个中的所有可能匹配项,当存在时给出 NULL
s没有匹配项。
来自 zip_codes
的不匹配记录将导致 zip.zip3
和 zip3.zip3
中的不同值,正好是第一个给出值,第二个是 NULL
,所以它不是在这种特殊情况下实际上等同于交换那些,您需要确定您需要 table 的哪些列,并消除其 table 名称的歧义。
此外,即使不是这种情况,错误仍然会弹出。如果我们将您的 LEFT JOIN
更改为 INNER JOIN
,您的假设是正确的并且列将始终具有相同的值,但您仍然会得到完全相同的错误。
原因是 SQL 分析器不够聪明,无法实现值始终相同。按照标准,如果您的查询引用来自不同 table 的同名列,您 必须 指定它来自哪个 table。没有进一步尝试解决歧义。
为什么在下面的代码中 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.zip3
或 zip3.zip3
或 COALESCE(zip.zip3, zip3.zip3)
来解决这个问题,但我很好奇为什么这是必要的。
虽然乍一看似乎列必须始终相同,但事实并非如此。 JOIN
实际上是一个 LEFT JOIN
,其中 returns 第一个 table 中的所有行和第二个中的所有可能匹配项,当存在时给出 NULL
s没有匹配项。
来自 zip_codes
的不匹配记录将导致 zip.zip3
和 zip3.zip3
中的不同值,正好是第一个给出值,第二个是 NULL
,所以它不是在这种特殊情况下实际上等同于交换那些,您需要确定您需要 table 的哪些列,并消除其 table 名称的歧义。
此外,即使不是这种情况,错误仍然会弹出。如果我们将您的 LEFT JOIN
更改为 INNER JOIN
,您的假设是正确的并且列将始终具有相同的值,但您仍然会得到完全相同的错误。
原因是 SQL 分析器不够聪明,无法实现值始终相同。按照标准,如果您的查询引用来自不同 table 的同名列,您 必须 指定它来自哪个 table。没有进一步尝试解决歧义。