這確實是一個格式問題,最好由客戶端處理。例如,在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數量將是可變的。
來源
2009-09-22 13:19:27
APC
真的不給我們太多的工作在這裏。這兩張桌子各有一列嗎?或者table1有4列,table2有2列? 也許你可以給我們一個你想要的結果看起來像什麼的確切例子? – 2009-09-22 13:09:37
你試圖得到什麼樣的結果(我不清楚)?兩張表之間的關係是什麼(是否有外鍵)? – Mac 2009-09-22 13:11:59
爲什麼在結果集中沒有table1.id1 = 3的行? – 2009-09-23 05:54:04