多表关联查询创建视图报错:SELECT语句列数不一致问题排查
解决UNION ALL列数不匹配的问题
你碰到的这个错误The used SELECT statements have a different number of columns,根源在于UNION ALL对所有子查询的列数和数据类型有严格要求——必须完全一致。
咱们拆解下你的SQL就能发现问题:
- 第一个子查询
SELECT *, 2017 AS year FROM states2017,返回的是states2017的全部字段,再加上一个标识年份的year列 - 第二个子查询里,你把
states2018和properties做了JOIN,然后用SELECT *会把两个表的所有字段都查出来,再加上year列——这就比第一个子查询多了properties表的所有字段,列数自然对不上了。
两种可行的修正方案
方案一:逐个年份表过滤后再合并
给每个年份的states表单独关联properties做过滤,只保留states表的字段和year列,再用UNION ALL合并:
CREATE OR REPLACE VIEW selected_states AS SELECT s.*, 2017 AS year FROM states2017 s JOIN properties p ON s.propertyID = p.propertyID WHERE p.userID = 1 UNION ALL SELECT s.*, 2018 AS year FROM states2018 s JOIN properties p ON s.propertyID = p.propertyID WHERE p.userID = 1;
方案二:先合并所有年份数据再过滤
如果后续还有更多年份的states表,这种写法更省心——先把所有年份的states数据合并成一个数据集,再和properties关联过滤:
CREATE OR REPLACE VIEW selected_states AS SELECT s.* FROM ( SELECT *, 2017 AS year FROM states2017 UNION ALL SELECT *, 2018 AS year FROM states2018 ) s JOIN properties p ON s.propertyID = p.propertyID WHERE p.userID = 1;
这两种写法都能满足你的需求:创建视图selected_states,只包含userID=1的propertyID对应的各年份states数据,同时避免列数不匹配的错误。
内容的提问来源于stack exchange,提问作者John Peeterson
相关产品推荐
相关产品推荐

