2009-09-22 57 views
0

我有聯接表時(左連接)的問題問題與加入數據庫表

表1:

id1 amt1 
1 100 
2 200 
3 300 

表2:

id2 amt2 
1 150 
2 250 
2 350 

我查詢:

select id1,amt1,id2,amt2 from table1 
left join table2 on table2.id1=table1.id2 

我假設的O/P是:

 id1 amt1 id2 amt2 
row1: 1 100 1 150 
row2: 2 200 2 250 
row3: 2 200 2 350 

我想在ROW3 O/P作爲

2 null 2 350 

即我想避免數據的重複(AMT1)。

+2

真的不給我們太多的工作在這裏。這兩張桌子各有一列嗎?或者table1有4列,table2有2列? 也許你可以給我們一個你想要的結果看起來像什麼的確切例子? – 2009-09-22 13:09:37

+0

你試圖得到什麼樣的結果(我不清楚)?兩張表之間的關係是什麼(是否有外鍵)? – Mac 2009-09-22 13:11:59

+0

爲什麼在結果集中沒有table1.id1 = 3的行? – 2009-09-23 05:54:04

回答

0

Assuning你想在一個單行的所有數據,你只是做一個工會選擇...

選擇從表A FIELDA聯盟 選擇fieldB從表B

請注意,您需要轉換數據類型對於兩個表來說都是一樣的。

如果您需要對方的回答,請格式化業績優於預期;)

好吧......

你已經糾正了格式化......

在上述情況下,我只想從我的查詢中返回2個遊標。示例數據沒有提供將兩個錶鏈接在一起的字段,所以我看不到以合理的方式將它們連接在一起的方式。一個sproc可以返回幾個結果集。

0

由於您沒有指定任何連接條件,因此您已經完成了兩個表的笛卡爾乘積。爲了消除重複,你需要指定你想如何加入表。

例如,你可以嘗試

select * from table1, table2 where table2.val = 111; 

您的例子沒有任何連接鍵,所以沒有明顯的價值加入在桌子上。但是更典型的例子是,這兩個表格中都會有一個相關的值,以便您可以以有意義的方式將它們結合在一起。

+0

那只有1行的數據,並且會過濾出空的222行 – 2009-09-22 13:15:14

3

這確實是一個格式問題,最好由客戶端處理。例如,在SQL * Plus,我們可以使用BREAK ....

SQL> select t1.*, t2.* from t1, t2 
    2/

A B C D   C1 
--- --- --- --- ---------- 
aaa bbb ccc ddd  111 
aaa bbb ccc ddd  222 

SQL> break on a on b on c on d 
SQL> select t1.*, t2.* from t1, t2 
    2/

A B C D   C1 
--- --- --- --- ---------- 
aaa bbb ccc ddd  111 
         222 

SQL> 

注:在沒有任何進一步的信息,我選擇了一個笛卡爾乘積。

編輯

BREAK是SQL Plus命令,這抑制了我們的行重複列。它只適用於SQL Plus客戶端。正如所料,它在Oracle的SQL * Plus用戶指南中有介紹。 Find out more.

我用BREAK作爲正確的做事方式的一個例子,因爲它是乾淨的,正確地實現了關注點的分離。它正在使用不同的客戶端,您需要使用格式化功能。可以調整SQL(見下文),但會降低查詢的效用,因爲我們無法在其他不想重複使用值的地方重複使用查詢。

無論如何,這裏是一個解決方案,它在內聯視圖中使用ROW_NUMBER()解析函數。

SQL> select * from t1 
    2/

A B C D   ID 
--- --- --- --- ---------- 
eee fff ggg hhh   1 
aaa bbb ccc ddd   2 

SQL> select * from t2 
    2/

     C1   ID 
---------- ---------- 
     333   2 
     111   1 
     222   2 
     444   2 

SQL> select t1_id 
    2   , case when rn = 1 then a else null end as a 
    3   , t2_id 
    4   , c1 
    5 from (
    6  select t1.id as t1_id 
    7    , row_number() over (partition by t1.id order by t2.c1) as rn 
    8    , t1.a 
    9    , t2.c1 
10    , t2.id as t2_id 
11  from t1, t2 
12  where t1.id = t2.id 
13  ) 
14 order by t1_id, rn 
15/

    T1_ID A  T2_ID   C1 
---------- --- ---------- ---------- 
     1 eee   1  111 
     2 aaa   2  222 
     2    2  333 
     2    2  444 

SQL> 

我選擇不使用LAG(),因爲只有擁有固定偏移工作,並且很可能的是排在T2數量將是可變的。

+0

我的問題是改變請看看它吧 你用我的問題回答我的問題我用的是oracle 9i – user2392858 2009-09-23 09:39:30

+0

我還是覺得你的需求比較滿意通過在客戶端應用格式而不是搞亂SQL。 – APC 2009-09-23 09:48:10

+0

我甚至沒有聽說過abt'break'你能解釋一下嗎? thnx提前... – user2392858 2009-09-23 10:11:59