【问题标题】:MSQL join tables with same columns具有相同列的 SQL 连接表
【发布时间】:2012-06-02 22:18:12
【问题描述】:

我环顾四周,找不到答案。可能是我不知道要查找的正确术语。

我有大约 15 个表,所有表都有相同的列和相似的数据。它们之间的唯一区别是创建日期。

我想像这样搜索其中一些:

SELECT * 
FROM table_2010, table_2011 
WHERE date_created BETWEEN '2010-04-01' AND '2011-04-01'
ORDER BY date_created

但我不相信这会起作用,因为它将我的所有数据视为 2 个表,并创建模棱两可的字段:P

有什么建议吗?这是工会工作还是什么?!

【问题讨论】:

  • 能否提供一些测试数据和预期结果?因为我能想到你想要达到的几个结果:)

标签: mysql datetime date date-range


【解决方案1】:

使用别名'

SELECT * 
FROM table_2010 as t2010, table_2011 as t2011 
WHERE t2010.date_created BETWEEN '2010-04-01' AND '2011-04-01'
ORDER BY t2010.date_created

【讨论】:

  • 我正在获取表不存在此处错误。这是因为它正在寻找我认为会表现为别名的表“t2010”和“t2011”。它们都在一个数据库中,这段代码仍然正确吗?
  • 对不起,需要忘记在FROM 子句中使用as
  • 啊哈哈,现在更有意义了
【解决方案2】:

创建表对象,试试这个

SELECT * 
FROM table_2010 AS t1, table_2011 AS t2
WHERE ( t1.date_created BETWEEN '2010-04-01' AND '2011-04-01' AND t2.date_created BETWEEN '2010-04-01' AND '2011-04-01')
ORDER BY t1.date_created,t2.date_created

【讨论】:

  • 如果我不需要创建表对象有什么好处?新手Q
  • object 将只是查询的样子。我们可以使用大表名的简单对象实例。示例使用 table_2010.date_createdt1.date_created 实例。哪一个容易问自己。
  • @cadi:我选择 Union。联盟比加入快看看这个Post
【解决方案3】:

试试这个

SELECT table_2010.*, table_2011.* 
FROM table_2010, table_2011 
WHERE table_2010.date_created >= '2010-04-01' AND table_2011.date_created <= '2011-04-01'
ORDER BY table_2010.date_created, table_2011.date_created

我相信 2010 年表中只有 2010 年的数据,而 2011 年表中只有 2011 年的数据。

【讨论】:

  • 如果这解决了您的问题,请接受答案。这就是 SO 的工作原理。
【解决方案4】:
SELECT *  FROM table_2010 
WHERE date_created BETWEEN '2010-04-01' AND '2011-04-01' ORDER BY date_created 

union

SELECT *  FROM table_2011 
WHERE date_created BETWEEN '2010-04-01' AND '2011-04-01' ORDER BY date_created 

【讨论】:

  • 这是最简单的结果
【解决方案5】:
select * 
from (SELECT * FROM table_2010
      WHERE date_created BETWEEN '2010-04-01' AND '2011-04-01'
      union
      SELECT * FROM table_2011
      WHERE date_created BETWEEN '2010-04-01' AND '2011-04-01'
) as t
ORDER BY date_created

【讨论】:

  • 工会开始对我有意义。但我不明白你添加的'as t'。
  • 您不能对联合的各个部分进行排序。您需要对完整的结果进行排序。这就是为什么所有联合都被视为一个结果然后进行排序的原因。你需要给你的组合结果一个表名。在这种情况下,它是t
【解决方案6】:

这是一个联合,但您需要从联合中进行选择以获得跨表的顺序,但如果 date_created 始终在表的年份,您可能可以跳过该步骤

Select * From (
SELECT *  FROM table_2010
WHERE date_created BETWEEN '2010-04-01' AND '2011-04-01'
Union all
Select * From Table_2010
WHERE date_created BETWEEN '2010-04-01' AND '2011-04-01'
) allmyTables
ORDER BY date_created 

【讨论】:

    猜你喜欢
    • 2016-03-24
    • 2021-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-25
    相关资源
    最近更新 更多