4

我有两个 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

4 回答 4

4

使用左外连接

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


SQL小提琴演示

编辑1:

这适用于 MySQL

这是为您更新的问题


SQL Fiddle 新演示

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
于 2012-10-10T07:34:39.340 回答
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”的列?如果不是故意的,我想这可能会变得混乱。

于 2012-10-10T08:34:40.087 回答
1

用于此,因此即使在另一个表上没有匹配项LEFT JOIN,它也会返回表上的所有记录。LEFT

SELECT  a.*, b.*
FROM    table1 a
        LEFT JOIN table2 b
            ON a.row1 = b.row3

SQLFiddle 演示

更多信息:连接的可视化表示

更新 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 演示

于 2012-10-10T07:34:39.357 回答
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'
于 2016-12-15T11:44:29.363 回答