在mysql中完整的OUTER JOIN或UNION

时间:2013-12-02 03:05:28

标签: php mysql join

我有两个临时表说temp1和temp2(在运行时创建)。我需要执行“FULL outer 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

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

2 个答案:

答案 0 :(得分:2)

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

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 ALLhttp://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

答案 1 :(得分:0)

在MySql中,您无法在同一查询中多次访问单个临时表。您正在模拟完全外部联接,左联接联合到右联接,对吗?

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

有意义吗?