在sql中使用不同的行连接两个表

时间:2012-10-10 07:33:17

标签: sql oracle

我有两个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 中使用。

4 个答案:

答案 0 :(得分:4)

使用LEFT OUTER JOIN

select * 
from table1 t1
LEFT OUTER  join table2 t2
on t1.row1=t2.row3      


SQL fiddle demo

<强> EDIT1:

这适用于MySQL

这是针对您更新的问题


SQL Fiddle new demo

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

SQLFiddle Demo

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

SQLFiddle Demo

答案 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'