SnowSQL语句报Unexpected SELECT/ON错误及WHERE子查询咨询
解决你的SnowSQL语法错误疑问
嘿,我来帮你搞定这两个报错和子查询的疑问~
首先明确:WHERE子句完全可以用SELECT子查询
Snowflake对这个语法是完全支持的,你不用怀疑这个用法的合法性,你的问题出在其他语法细节上。
排查Unexpected SELECT/ON错误的核心原因
从你贴的SQL片段来看,有两个明显的语法问题,大概率就是报错的根源:
1. DateSerial函数的参数写法错误
看你WHERE条件里的这段:
WHERE b.period_start >= ( select MIN(mt.Reference_Date ) FROM BAS_report_date tr INNER JOIN inv_bas_445_Month_Alignment mt ON tr.sunday_month = DateSerial(mt.'445_Year',mt.'445_Month,1') )
这里有两处错误:
- 列名不能用单引号包裹!如果你的列名是
445_Year这种数字开头的,应该用双引号,比如mt."445_Year" - 第二个参数里的
mt.'445_Month,1'明显是手滑打错了,逗号跑到引号里去了,应该拆成mt."445_Month", 1
修正后这段应该是:
WHERE b.period_start >= ( SELECT MIN(mt.Reference_Date ) FROM BAS_report_date tr INNER JOIN inv_bas_445_Month_Alignment mt ON tr.sunday_month = DateSerial(mt."445_Year", mt."445_Month", 1) )
这个错误会直接导致解析器无法识别SELECT语句的结构,触发Unexpected SELECT报错。
2. 未完成的LEFT JOIN语句
你提供的SQL最后一段是:
) t1 LEFT JOIN ( SELECT MATERIAL_NUMBER, CINT(LOCATION_NUMBER) AS Int_Location_ID, HCI_DS_KEYFIGURE_DATE, HCI_DS_KEYFIGURE_QUANTITY, PLANNED_QUANTITY, VALUATED_UNRESTRICTED_USE_STOCK FROM inv_vw_ibp_transit_inventorry_dev ) ti
这里的LEFT JOIN后面没有写ON连接条件,Snowflake要求JOIN必须指定关联条件(交叉连接除外),所以解析器会抛出Unexpected ON错误。你需要补充上t1和ti表的关联逻辑,比如:
) t1 LEFT JOIN ( SELECT MATERIAL_NUMBER, CINT(LOCATION_NUMBER) AS Int_Location_ID, HCI_DS_KEYFIGURE_DATE, HCI_DS_KEYFIGURE_QUANTITY, PLANNED_QUANTITY, VALUATED_UNRESTRICTED_USE_STOCK FROM inv_vw_ibp_transit_inventorry_dev ) ti ON t1.Material = ti.MATERIAL_NUMBER AND t1.dc = ti.Int_Location_ID -- 替换成你的实际关联字段
3. 额外小建议:优化嵌套括号的可读性
你的FROM子句里堆了一堆( ( ( ( (,虽然语法上合法,但很容易导致括号不匹配,建议用缩进和换行把每个子查询分开,这样排查错误会轻松很多。
最后小技巧
排查SQL语法错误时,可以先单独运行子查询(比如那个WHERE里的子查询),验证子查询本身没问题,再逐步拼接整个语句,这样能快速定位问题点~
内容的提问来源于stack exchange,提问作者2tone_tony
相关产品推荐
相关产品推荐

