我有两个sql查询,它给了我两个不同行数的表,我需要加入它们 - 只需相互显示两个表
表1
row1 row2
==============
12 gfd
13 jf
14 gfd
15 jhhh
表2
row3 row4
==============
18 gjkd
11 jfyty
结果
row1 row2 row3 row4
======================================
12 gfd 18 gjkd
13 jf 11 jfyty
14 gfd
15 jhhh
每个表中的数据完全不同,并且具有不同的字段名称。我使用 Oracle DB ,查询需要在 iReport 中使用。
答案 0 :(得分:4)
select *
from table1 t1
LEFT OUTER join table2 t2
on t1.row1=t2.row3
<强> EDIT1:强>
这适用于MySQL
这是针对您更新的问题
select row1,row2,row3,row4
from
(select row1,row2,@i:=@i+1 AS rn
from Table1,(SELECT @i:=0) r)t1
left join
(select row3,row4,@j:=@j+1 AS rn
from Table2,(SELECT @j:=0) r )t2
on t1.rn=t2.rn
答案 1 :(得分:2)
在我看来,你想按照每个表中行的顺序加入这两个表。很抱歉,SQL没有表中隐式行顺序的概念,并且在SQL中没有办法连接两个(或更多)表的列,而没有任何列允许JOIN。
您可以在SQL中完成的最接近的事情是:
CROSS JOIN
。这将重复table1中每一行到table2的每一行:SELECT t1.row1, t1.row2, t2.row3, t2.row4
FROM table1 t1
CROSS JOIN table1 t2
-- row1 row2 row3 row4
-- ---- ------ ---- ------
-- 12 gfd 18 gjkd
-- 13 jf 18 gjkd
-- 14 gfd 18 gjkd
-- 15 jhhh 18 gjkd
-- 12 gfd 11 jfyty
-- 13 jf 11 jfyty
-- 14 gfd 11 jfyty
-- 15 jhhh 11 jfyty
OUTER JOIN
:SELECT t1.auxOrder1, t1.row1, t1.row2, t2.auxOrder2, t2.row3, t2.row4
FROM table1 t1
LEFT OUTER JOIN table1 t2 ON (t1.auxOrder1 = t2.auxOrder2)
-- auxOrder1 row1 row2 auxOrder2 row3 row4
-- --------- ---- ------ --------- ---- ------
-- 1 12 gfd 1 18 gjkd
-- 2 13 jf 2 11 jfyty
-- 3 14 gfd
-- 4 15 jhhh
顺便说一句,为什么要创建名称为“row1”,“row2”的列?如果不是这样的话,我想这可能会让人感到困惑。
答案 2 :(得分:1)
为此使用LEFT JOIN
,因此它将返回LEFT
表上的所有记录,即使它在另一个表上没有匹配。
SELECT a.*, b.*
FROM table1 a
LEFT JOIN table2 b
ON a.row1 = b.row3
For more info: Visual Representation of Joins
更新1
如果您使用SQL Server
SELECT a.row1, a.row2,
b.row3, b.row4
FROM
(
SELECT ROW_NUMBER() OVER (ORDER BY row1 ASC) rn,
row1, row2
FROM table1
) a LEFT JOIN
(
SELECT ROW_NUMBER() OVER (ORDER BY row3 ASC) rn,
row3, row4
FROM table2
) b ON a.rn = b.rn
答案 3 :(得分:0)
为了显示两个表中的唯一名称和地址值,而不是在进行连接时重复值,此查询将从两个表中获取唯一值并按顺序显示它们。
这是我使用oracle 11能够做到的:
select name, address, table1_id, table2_id
from
(
select table1_id, name, table_id||(row_number () over (partition by table_id order by name desc nulls last)) as table1_id_row
from
(
select distinct table_id table1_id, name
from table1
where table_id is not null
)
)
FULL OUTER JOIN
(
select table2_id, address, table_id||(row_number () over (partition by table_id order by address desc nulls last)) as table2_id_row
from
(
select distinct table_id table2_id, address, city, state, zip
from table2
where table_id is not null
)
)
ON table1_id_row = table2_id_row
where table1_id = '123456789' or table2_id = '123456789'