2011-04-14 31 views
2

是否可以創建一個mysql select(直接或使用存儲過程),它將返回空白以重複列。例如,選擇通常有2列返回這7個記錄:mysql選擇返回所有空白,但重複列的第一行

Bob 123 
Bob 557 
Bob 888 
Joe 887 
Joe 223 
Tom 899 
Tom 999 

我寧願直接看到這個從SQL SELECT:

Bob 123 
     557 
     888 
Joe 887 
     223 
Tom 899 
     999 

我知道我可以只發布過程記錄在我的程序中,但我想用sql調用中的空白替換重複項。

回答

2

是的,這是可能的,但它會是非常昂貴(子查詢!),而且根本沒有效率。無論您使用哪種語言,或者您直接傳輸此數據,都不值得讓SQL將這幾個字節留空。

1

看起來如果不通過應用程序執行它會浪費大量資源,但可以這樣做的一種方法是在存儲過程中使用PL/SQL或類似的東西來填充臨時表。有了這個,你可以聲明一個變量,如果該名稱等於迭代的姓氏。所以如果這個名字是一個新名字,那麼把它添加到臨時表中,否則不要。

雖然再次,這是一個巨大的資源

3

下面應該工作的浪費,但它不能在你已經在你的例子使用的順序返回結果。

SELECT IF(n.ID = nm.ID, n.Name, NULL) 
     , n.ID 
FROM Names n 
     INNER JOIN (
      SELECT Name 
        , ID = MIN(ID) 
      FROM Names   
      GROUP BY 
        Name 
     ) nm ON nm.Name = n.Name 
ORDER BY 
     n.Name 
     , n.ID 
1

對於MySQL(我想這應該是其他類似的DB),以避免對每一行重複列值,你可以好好利用的變量。沒有必要的子查詢:輕而快。

//Init a variable 
SET @previous:=""; 

//Remember previous row value 
SELECT IF([email protected], "", @previous:=Name) AS GroupedName, Value 
FROM tableName ORDER BY 1; 
0

對於將來的讀者,這裏是一個選擇查詢,它將返回空格以重複列值。

SELECT IF([email protected], "", @previous:=name) as name_, value 
FROM (SELECT @previous:= '') AS temp, tableName 
ORDER BY name 
+0

如果只在相同的select語句中讀取和寫入變量不是未定義的行爲。 – philipxy 2018-02-13 08:39:35

相關問題