【问题标题】:Full OUTER JOIN OR UNION in mysqlmysql中的完整外部连接或联合
【发布时间】:2013-12-17 16:24:54
【问题描述】:

我有两个临时表 temp1 和 temp2(它们是在运行时创建的)。我需要执行“FULL external JOIN”来从两个表中获取数据。但我得到了错误

Error Number: 1064
You have an error in your SQL syntax; check the manual that corresponds to your 
MySQL server version for the right syntax to use near 'FULL OUTER JOIN cashExtTemp t2 
ON t1.code = t2.code'

SELECT * FROM cashIntTemp t1 FULL OUTER JOIN cashExtTemp t2 ON t1.code = t2.code

并且通过此链接Full Outer Join in MySQL 了解到在 MySQL 中不可能进行 FULL OUTER JOIN 并尝试按照链接中给出的方式实现 UNION。因为我使用的是临时表,所以它不起作用,我得到了错误

Error Number: 1137 
Can't reopen table: 't1'

这是我的 UNION 查询

SELECT * FROM cashIntTemp t1 LEFT JOIN cashExtTemp t2 ON t1.code = t2.code
UNION
SELECT * FROM cashIntTemp t1 RIGHT JOIN cashExtTemp t2 ON t1.code = t2.code

表中的数据会是这样的 表:cashIntTemp

code     qty     date
P001     100    2013-11-29 
P003     200    2013-11-30
P005     600    2013-11-30

表中的数据会是这样的 表:cashIntTemp

code     qty     date
P001     110    2013-11-29 
P002     250    2013-12-01
P005     650    2013-12-01

我需要一个查询来获取两个表中的所有数据。

我需要这种格式的结果

code     qty     date        code    qty     date
P001     100    2013-11-29   P001    110   2013-11-29
P002     250    2013-12-01
P003     200    2013-11-29   
P005     600    2013-11-29   P005    650   2013-11-29

所以请帮助我。提前致谢。

【问题讨论】:

  • select * from (select * from tbl where someclause) t1 left join ANOTHERTABLE s ON (s.id=t1.id)

标签: php mysql join


【解决方案1】:

编辑:完全错过了关于临时表的部分,不知道这是否可行...

sqlfiddle:http://sqlfiddle.com/#!2/3bf61/10

我没有得到 100% 的你所放弃的东西,让我试着改写一下: 您有 2 个表:cashIntTempcashExtTemp。在单个查询中,您希望从两个表中获取所有行。预期结果是:

CODE    QTY DATE
P001    100 November, 29 2013 00:00:00+0000
P002    250 December, 01 2013 00:00:00+0000
P003    200 November, 30 2013 00:00:00+0000
P005    650 December, 01 2013 00:00:00+0000
P005    600 November, 30 2013 00:00:00+0000

UNION 将再次根据@Ryan 提供您想要的东西,只要它们是不同的表。您的问题的一部分引用了两个不同的表,而另一部分引用了同一个表。

以下不应该是你所追求的吗?

SELECT * FROM `cashIntTemp` as `t1`
UNION
SELECT * FROM `cashExtTemp` as `t2`
ORDER BY `code`

或者,如果您不想过滤重复行,use UNION ALL:http://sqlfiddle.com/#!2/3bf61/11

查询:

SELECT * FROM `cashIntTemp` as `t1`
UNION ALL
SELECT * FROM `cashExtTemp` as `t2`
ORDER BY `code`

结果:

CODE    QTY DATE
P001    100 November, 29 2013 00:00:00+0000
P001    100 November, 29 2013 00:00:00+0000
P002    250 December, 01 2013 00:00:00+0000
P003    200 November, 30 2013 00:00:00+0000
P005    650 December, 01 2013 00:00:00+0000
P005    600 November, 30 2013 00:00:00+0000

【讨论】:

  • 对不起,我忘了在问题中提及所需的结果。现在我已经添加了。
  • @saran,你有多个临时表,还是只有一个?他们叫什么?你用数据引用cashIntTemp 两次:“表中的数据将是这样的表:cashIntTemp”
  • 我有两个临时表,“cashIntTemp”和“cashExtTemp”。两个表中的数量会有所不同。
  • @saran,无论我多么努力,我似乎​​都无法使用 temporary 表获得类似FULL OUTER JOIN 的单个查询。我只能看到它发生在两次,在这种情况下,您不妨在 diff 表上查询 db 两次。
  • @saran 这和我得到的一样接近,但它很丑陋,实际上与完全外连接不同,它只是连接表同时隔离它们的列:SELECT t1.code as t1code,qty as t1qty,date as t1date,null as t2code,null as t2qty,null as t2date FROM cashIntTemp as t1 UNION SELECT null as t1code,null as t1qty,null as t1date,t2.code as t2code,qty as t2qty,date as t2date FROM cashExtTemp as t2;
【解决方案2】:

在 MySql 中,您不能在同一个查询中多次访问一个临时表。您正在模拟完全外连接,左连接与右连接结合,对吗?

您必须将左连接的结果集和右连接的结果集插入到单独查询中的单独临时表中(即,不使用联合)。

有意义吗?

【讨论】:

    猜你喜欢
    • 2017-06-09
    • 2010-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-22
    • 1970-01-01
    • 2015-03-31
    • 1970-01-01
    相关资源
    最近更新 更多