gpt4 book ai didi

mysql - (My)SQL 列名解析的规则是什么?

转载 作者:行者123 更新时间:2023-11-29 02:20:38 24 4
gpt4 key购买 nike

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

You need not specify a tbl_name or db_name.tbl_name prefix for a column reference in a statement unless the reference would be ambiguous. Suppose that tables t1 and t2 each contain a column c, and you retrieve c in a SELECT statement that uses both t1 and t2. In this case, c is ambiguous because it is not unique among the tables used in the statement. You must qualify it with a table name as t1.c or t2.c to indicate which table you mean.

但是,这似乎不适用于嵌入的 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是如何解释的呢?一般规则是什么,它们在数据库供应商之间有何不同?消除一切歧义或依赖默认范围并仅在必要时限定是否被认为是好的做法?

最佳答案

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

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

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 值都是如此——可能不是原始查询的意图。

关于mysql - (My)SQL 列名解析的规则是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32429363/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com