我有一个连接(不是我的)有3个不同的表和选定的某些列。有些具有相应表的前缀,有些则没有。 示例:
Select a.column1 as column1, b.column2 as column2, column3 as column3, b.column4 as column4, c.column5 as column5, b.column6 as column6 from a, b, c where a.column1 = b.column1 and *column10* = b.column5
何时需要将某个列标记为特定表中的特定列,何时不是?有没有办法通过查看SQL语句来找出某个列是哪一个表? (例如column3或column10)
谢谢!
答案 0 :(得分:1)
为了更好的可读性和理解,我们始终建议在列名称前加上表名或表别名,但是如果在多个表中列名称重复,则表示您正在加入然后,必须为表名添加前缀,并使用列名称强制指定您尝试获取的表列,否则最终会出现不明确的列名错误
答案 1 :(得分:0)
某些表具有重复的列名称 - 每个列都有别名是在执行连接时区分多个表中具有相同名称的列的有用方法。但经验法则是,使用别名通常是一个好主意,以避免可能产生混淆的情况。
当您在列名称上使用运算符时也很有用,例如MAX(table1.ProductID)
。您可以使用MAX(table1.ProductID) AS MaxProductID
使列引用更具可读性和更友好性,而不是直接引用列。
答案 2 :(得分:0)
答案需要简短的历史课。
在关系模型中,两个关系之间的操作导致关系,并且关系没有重复列。在最早的SQL版本中(在20世纪70年代!),决定了表表达式可能有重复的列。但是如何区分呢?选择的解决方案是使用范围变量,这个概念已经存在于数据库理论中。
注意术语在这里有点混淆:SQL标准(始于20世纪80年代!)使用术语“相关名称”(尽管没有“相关性”的概念);大多数供应商文献 - 因此大多数SO用户 - 使用术语“表别名”(这不合适,因为它取代了行);文献使用术语“范围变量”(如“表格行中的范围”)。
稍后,当将派生表引入SQL时,实现了允许重复列的错误。虽然从派生开始对派生表强制要求使用唯一列名,但在查询中顶级SELECT
的结果中仍允许使用重复的列名,因为不会弃用或从SQL语言中删除任何内容。
1992年(在20世纪90年代!),非关系型SQL运算符被给予了更正版本,例如UNION
成为UNION CORRESPONDING
,JOIN
成为NATURAL JOIN
。
所以使用最新的连接语法
SELECT * FROM a NATURAL JOIN b
将使用相同运算符在具有相同名称的列上连接表,不需要使用范围变量,并且生成的表表达式不会有重复的列名。
那说,它不适用于你的例子!你刚刚当场弥补吗?我觉得奇怪的是,两个表有一个名为column5
的公共列,但你不会用它们加入;相反,您选择将column5
加入column10
。如果这些是真正的表格,那么你有比你可能意识到的更深层次的问题:)