【问题标题】:join two tables in sql with different rows用不同的行在sql中连接两个表
【发布时间】:2017-02-02 18:01:53
【问题描述】:

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

【问题讨论】:

  • 您使用的是MySQL 还是SQL server
  • 哪个 RDBMS? mysql 或 sql server 还是别的什么?
  • 我调整了问题,我尝试从答案中提出建议,但可以调整 iReport,也许有人可以使用它?

标签: sql oracle


【解决方案1】:

使用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

【讨论】:

  • 在提供的示例中,table1.row1 列与 table2.row3 不匹配。
  • @Gerardo:在乔回答后,问题已被编辑/更改。
  • @GerardoLima:我已经为他更新的问题更新了我的答案。请检查
  • 对不起,我没有看到变化,但是这个解决方案不能保证行的顺序。
  • @GerardoLima:请查看链接“SQL Fiddle new demo”
【解决方案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”的列?如果不是故意的,我想这会变得混乱。

【讨论】:

  • 它只是名字,不管它是什么。
【解决方案3】:

为此使用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

【讨论】:

    【解决方案4】:

    为了显示来自两个表的唯一名称和地址值,而不是在执行连接时重复值,此查询将从两个表中获取唯一值并按顺序显示它们。

    这是我使用 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'
    

    【讨论】:

    • 请尝试解释您的代码的关键元素
    • 希望改变有所帮助
    猜你喜欢
    • 2019-09-22
    • 2017-02-20
    • 2014-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-31
    • 2013-07-08
    相关资源
    最近更新 更多