【问题标题】:Multiple UNION and JOIN ON多个 UNION 和 JOIN ON
【发布时间】:2018-11-09 04:40:23
【问题描述】:

如何从多个表中选择行加入特定键?

我有几个表states(year) 具有相同的结构。我想创建一个视图,仅从states(year) 中选择行,其中propertyid 包含在特定用户下的表properties 中:

CREATE OR REPLACE VIEW selected_states AS
SELECT *, 2017 AS year FROM states2017
UNION ALL SELECT *, 2018 AS year FROM states2018
AS s
JOIN properties p ON s.propertyID = p.propertyID WHERE p.userID=1

遇到错误

使用的 SELECT 语句的列数不同

SQLfiddle:http://sqlfiddle.com/#!9/aca397c

【问题讨论】:

  • 你为什么想要一个视图?
  • 我希望稍后在另一个查询中使用该 VIEW。
  • 我不鼓励这样做。 MySQL 在优化视图方面很差。
  • 无论如何,无论你想使用哪种 SELECT,都不要使用SELECT *。相反,请始终命名您实际希望返回的所有列 - 即使它们就是所有列。
  • 此外,每当您发现自己使用枚举列时,警钟应该开始响起。只需有一个带有年份(或任何类型的时间戳)列的状态表。

标签: mysql


【解决方案1】:

结构

SELECT *, 2017 AS year FROM states2017

和

SELECT *, 2018 AS year FROM states2018

不一样。第一个表的最后一列是2017,而第二个表的最后一列是2018,所以不能合并。

解决这个问题,为两个表中的年份创建一个通用别名。

CREATE OR REPLACE VIEW selected_states AS
SELECT s.*, p.userID FROM
(SELECT states2017.*, '2017' `Year` FROM states2017
UNION ALL 
SELECT states2018.*, '2018' `Year` FROM states2018) s
JOIN properties p ON s.propertyID = p.propertyID WHERE p.userID=1;

查看DEMO on SQL Fiddle。

【讨论】:

  • 出现错误:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 'AS year FROM states2017 UNION ALL SELECT states2018.*, '2018' Year AS year FRO' 附近使用正确的语法。请参阅sqlfiddle.com/#!9/aca397c/2
  • 谢谢,将您的回复部分正确地标记为以“修复该问题...”开头的部分。对于未来的访问者,请忽略 SELECT *, 2017 AS year FROM states2017 和 SELECT *, 2018 AS year FROM states2018 的结构不同的概念 - 这不是真的,它们是相同的 - 请参阅 sqlfiddle.com/#!9/aca397c/7 (如果添加撇号并删除 AS 运算符,则没有区别我的代码)。
  • 你能想出一个不包含 FROM 子查询的查询吗?尽管您的解决方案适用于 SQL Fiddle,但由于较低的 MySQL 版本引发错误 View's SELECT contains a subquery in the FROM clause(如 stackoverflow.com/questions/8428641/… 中所述),它不适用于我的网络服务器
猜你喜欢
  • 2019-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-31
  • 2015-05-17
相关资源
最近更新 更多