(我的)SQL列名称解析的规则是什么?

时间:2015-09-06 23:41:12

标签: mysql sql

如果连接将两个具有相同名称的列组合在一起,则必须使用表名或别名限定对该名称的任何使用。正如它在MySQL manual中所说的那样:

  

除非引用不明确,否则无需在语句中为列引用指定tbl_name或db_name.tbl_name前缀。假设表t1和t2每个都包含一个列c,并在SELECT语句中检索c,该语句同时使用t1和t2。在这种情况下,c是不明确的,因为它在语句中使用的表中不是唯一的。您必须使用表名为t1.c或t2.c来限定它,以指示您的表。

但是,这似乎不适用于嵌入式SELECT语句。以下是合法的:

SELECT a, b FROM tablename WHERE 
    EXISTS (SELECT 1 FROM tablename WHERE column1 = column2)

当然,我可以消除两个列名称的歧义,以获得更有用的东西:

SELECT a, b FROM tablename t1 WHERE 
    EXISTS (SELECT 1 FROM tablename t2 WHERE t1.column1 = t2.column2)

但是如何解释不合格的column1column2?一般的规则是什么,它们在数据库供应商之间是否存在差异?将一切消除歧义或依赖默认范围并仅在必要时获得资格是否被视为良好做法?

1 个答案:

答案 0 :(得分:2)

在相关子查询中,通过查看最里面的范围然后移出来解析列名称。使用解析列的第一个范围。

注意:您应该始终在相关子查询中使用限定列名。很容易犯这样的错误:

SELECT *
FROM t1
WHERE  t1.column1 IN (SELECT column1 FROM t2)

如果column1不在t2,那么(正确地)解释为:

SELECT *
FROM t1
WHERE  t1.column1 IN (SELECT t1.column1 FROM t2)

对于t1.column1的所有非NULL值都是如此 - 可能不是原始查询的意图。