2013-05-28 51 views
2

我有兩個表。標題和順序。標題有title_num。訂單有title_num和order_num。每個標題都有很多訂單。用一列顯示多行

我想顯示title_num及其所有的命令。但我想,以顯示它讓我顯示多個order_nums 1個title_num:

title_num| order_num 
1   a 
1   b 
1   c 
2   x 
2   y 

我想它看起來像:

title_num| order_num 

1   a 
      b 
      c 

2   x 
      y 

我使用LEFT JOIN試圖對它進行排序標題,但這是我卡住的地方。可以像這樣顯示嗎?

select t.title_num, o.order_num 
from title t 
left join order o 
on t.title_num=o.title_num 
+0

如果您使用的是SQL * Plus,那麼您可以使用['break'](http://docs.oracle.com/cd/E11882_01/server.112/e16604/ch_twelve009.htm)[描述在文檔中](http://docs.oracle.com/cd/E11882_01/server.112/e16604/ch_six。htm#i1081534)來實現這一點,包括值之間的差距(例如'title_num nodup skip 1'上的斷點)。這似乎沒有被遺留給SQL Developer。 –

回答

3

(沒有足夠的代表發表意見,所以我給的答案選項)

不能隱藏的結果,如果它一樣的上一行。相反,你會在代碼或報告中處理它。

  • 如果您在報告中顯示它,您可以將結果分組到報告管理器中。

  • 如果您在代碼中迭代,請使用一個跟蹤該列變量的變量。

    用空白字符串初始化變量。然後在迭代查詢的數據集時:

    1. 如果當前行值與該變量的值相同,則顯示空白。否則,顯示行值。
    2. 將該變量設置爲當前行的值。
+1

是的,在報告中顯示它比試圖讓我的SQL查詢起作用要容易得多。謝謝。 – user2300868

+1

非常好,很高興我能幫到你! (咳嗽咳嗽..標記我的答案;)) – Stamp

2

您可以用LAG功能和CASE語句做到這一點。

SELECT CASE WHEN LAG(title_num,1) OVER (PARTITION BY title_num ORDER BY order_num) IS NULL THEN title_num 
       ELSE ' ' 
     END 
     ,order_num 
FROM Order 

SQL Fiddle Demo

+0

我試過這第一,但我也有其他參數顯示也是如此,我放棄了它。幸運的是,我以某種方式在報告中運作了它。儘管感謝您的幫助,但在嘗試使用此代碼後,我還是多瞭解了一些關於查詢的信息,所以它仍然有幫助。 – user2300868

1

使用窗函數(在Oracle的說法解析函數)row_number()

SELECT CASE WHEN row_number() OVER (PARTITION BY title_num 
            ORDER BY order_num) = 1 THEN 
     title_num ELSE NULL END AS title_num 
     ,order_num 
FROM ord o 
ORDER BY o.title_num, order_num; 

->SQLfiddle

爲什麼你JOINtitle?有沒有命令的標題?否則,您可以從查詢中忽略它。

不要使用保留字如order作爲表名。我在我的解決方案中使用了ord

請注意,表格限定o.title_numORDER BY指的是輸入列,而不是輸出列。

+0

我正在使用連接,因爲我需要顯示來自兩個表的更多參數。但我想我得到了我想要的結果。在看到你的代碼後,我意識到我正在考慮這個問題。謝謝。 – user2300868