2012-10-10 29 views
4

我有兩個SQL查詢這使我行的不同量的兩個表,我需要加入他們的行列 - 只是互相顯示兩個表連接兩個表中的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

您使用'MySQL'或'SQL server'? –

+0

哪個RDBMS? MySQL或SQL服務器或其他東西? –

+0

我調整了問題,我嘗試了建議的答案,但可以調整iReport,也許有人使用它? – khris

回答

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

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:[email protected]+1 AS rn 
     from Table1,(SELECT @i:=0) r)t1 
left join 
    (select row3,row4,@j:[email protected]+1 AS rn 
     from Table2,(SELECT @j:=0) r)t2 
on t1.rn=t2.rn 
+0

在提供的示例中,「table1.row1」列與「table2.row3」不匹配。 –

+1

@Gerardo:喬回答後,編輯/更改了這個問題。 –

+0

@GerardoLima:我更新了我的答案,以便更新他的問題。Plz檢查 –

2

在我看來,要通過每個表中的行的順序來連接兩個表。我很抱歉,但是SQL沒有表格中行的隱式順序的概念,並且SQL中沒有辦法連接兩個(或更多)表的列而沒有任何列來允許JOIN。

,你可以在SQL完成最近的事情是:

  • 兩個表之間CROSS JOIN。這將重複每一行從表1至表2中的每一行:
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」,「2行」列的方式嗎?如果沒有打算,我想這可能會變得混亂。

+0

它只是名稱,不管它是什麼。 – khris

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' 
+1

請嘗試解釋您的代碼的關鍵元素 – loki

+0

希望更改有助於 – Raul