左连接 ON 非空列不能选择非空列

Posted

技术标签:

【中文标题】左连接 ON 非空列不能选择非空列【英文标题】:Left join ON not null columns can't select not null column 【发布时间】:2016-04-07 20:39:21 【问题描述】:

每个表都有一个列 RECNUM。它们是(十进制(28,0),不为空)。这就是我加入的地方。我想在 CUNIT 中选择 DESC 列。它是 (varchar(28,0),不是 null)。当我运行查询时,我得到:

消息 156,级别 15,状态 1,行 1 关键字“DESC”附近的语法不正确。以下是我的查询:

SELECT CDCLSVC.UNIT_ID,CAUNIT.DESC
FROM CDCLSVC
LEFT JOIN CAUNIT
ON CDCLSVC.RECNUM = CAUNIT.RECNUM

【问题讨论】:

SELECT CDCLSVC.UNIT_ID,CAUNIT.[DESC] ... DESC 是关键字。用[] 引用它或重命名例如“描述”。 并且以后尽量避免使用 SQl 服务器关键字作为对象名称。 嗨@lad2025:这不是评论,而是答案:-) @ThorstenKettner 是的,但我认为这个问题是明显的“错字”,应该关闭。 @lad2025:显然,当 Chris 选择 DESC 作为列名时,他不知道他使用了保留字。所以这个问题没问题。而且,谁知道呢,将来有人甚至可能会犯类似的错误,并且很高兴找到这个请求和答案。 【参考方案1】:

问题在于DESC 列。在SQL Server 中是reserved keyword:

Microsoft SQL Server 使用保留关键字来定义, 操作和访问数据库。保留关键字是 SQL Server 使用的 Transact-SQL 语言的语法 解析和理解 Transact-SQL 语句和批处理。 虽然它 在语法上可以使用 SQL Server 保留关键字作为 Transact-SQL 脚本中的标识符和对象名称,您可以这样做 只能使用分隔标识符。

可能的解决方案:

    重命名列,例如description 引用[]

您也可以使用别名来避免输入完整的表名:

SELECT cd.UNIT_ID,ca.[DESC]
FROM CDCLSVC cd 
LEFT JOIN CAUNIT ca
ON cd.RECNUM = ca.RECNUM

【讨论】:

以上是关于左连接 ON 非空列不能选择非空列的主要内容,如果未能解决你的问题,请参考以下文章

在一列中获取火花数据帧的所有非空列

如何使用 MYSQL 中的连接从多个表中获取多个列并在非空列上显示数据以及在空列上显示 null 或零

选择 PL/SQL 中两个非空列值之间的行集

如何根据另一列的值创建空列或非空列?

如何将一个表与另一个表连接,然后计算非空列并将它们按另外两个字段分组?

ALTER TABLE,在非空列中设置空,PostgreSQL 9.1