2012-02-16 73 views
1

我一直在四處尋找,並一直未能找到如何做到這一點(雖然已經發現很多關於分析它的性能?!)如何在SQL中隱藏或隱藏重複值?

我想執行一個選擇,返回幾個數據列,然後是另一個表中相關行的嵌套表(實際上是同一個表連接在一起,但我認爲這是相關的)。

所以數據是這樣的:

id name registered 
1 Dan  N 
2 Bill  N 
3 Bob  N 
4 Dan  N 
5 Bill  Y 
6 Dan  Y 

的想法是進行選擇其認爲所有誰可能與一個註冊賬號未登記的人。

所以結果看起來就會像

registered.id name notreg.id name 
    5    Bill  2   Bill 
    6    Dan  1   Dan 
         4   Dan 

我用SQL好起來可以處理所有的選擇標準等,並有一個返回一個正常的內部查詢加入該發現這一點,但想知道是否有可能得到一個像這樣的結果集,所以在左側沒有重複值?

+0

如果你想這是XML,你可以用它做ms-sql中的for xml屬性... – 2012-02-16 22:38:24

+0

我不認爲這是可能的SQL 。您應該在前端應用程序或報告引擎中執行此操作。 – 2012-02-16 22:39:31

+0

這將是很好的,但查詢結果會直接通過賈斯珀報告(說實話,我沒有檢查,看它是否可以處理這些結果,但現在是關於你是否可以這樣做的原則) – 2012-02-16 22:42:06

回答

8

你可能會更好過抑制重複它在客戶端(例如在Jasper報表取消Print Repeated Value或XML設定isPrintRepeatedValues="false"

但是在任何支持WITHROW_NUMBER()(如Oracle,SQL服務器2005+)。

WITH ns 
     AS (SELECT Row_number() OVER (PARTITION BY name ORDER BY id) rn, 
        id, 
        name, 
        registered 
      FROM t 
      WHERE registered = 'N') 
    SELECT t.id, 
      t.name, 
      ns.id, 
      ns.name 
    FROM ns 
      LEFT JOIN t 
      ON ns.name = t.name 
       AND t.registered = 'Y' 
       AND ns.rn = 1 
    WHERE ns.name IN (SELECT name 
         FROM t 
         WHERE registered = 'Y') 

    ORDER BY ns.name 

See working example

如果你沒有做和ROW_NUIMBER你可以做到這一點

SELECT t.id, 
     t.name, 
     ns.id, 
     ns.name 
FROM t ns 
     LEFT JOIN (SELECT MIN(id) id, 
         name 
        FROM t 
        WHERE registered = 'N' 
        GROUP BY name) MINNS 
     ON ns.id = MINNS.id 
     LEFT JOIN t 
     ON ns.name = t.name 
      AND t.registered = 'Y' 
      AND MINNS.id IS NOT NULL 
WHERE ns.registered = 'N' 
     AND ns.name IN (SELECT name 
         FROM t 
         WHERE registered = 'Y') 
ORDER BY ns.name, 
      ns.id 

See working example

+0

謝謝!!在真正的桌子上使用它有點麻煩(我的例子非常簡化),但它確實是我想要的!再次感謝您的幫助 – 2012-02-16 23:10:48

+0

謝謝Jasper報告的提示,我也會看看。 – 2012-02-16 23:11:38

+0

很高興能幫到您 – 2012-02-16 23:12:55