2013-01-11 66 views
1

我不熟悉SQL或SQLITE。返回重複(ish)行。如何消除?

我正在運行一個簡單的select和join語句。我基本上是從sqlite3數據庫中提取聯繫人,並手動將它們傾倒到csv中。

我遇到的問題是,我有一個表中的名稱和ID,另一個表中有電話號碼和標籤。標籤的意思是「手機」,「工作」等。

所以我加入了名稱ID =到電話號碼的所有者ID。

我發現(而且這很有道理)是,如果我有一個人的三個電話號碼,那麼一個人出現三次。

IE:

John Doe, 123-123-1234, Home, someInc 
John Doe, 123-123-4321, Mobile, someInc 
John Doe, 123-456-3214, Work, someInc 

現在..我該如何,通過實際的SQL語句本身,得到的結果更是這樣的:

John Doe, 123-123-1234, Home, someInc 
      123-123-4321, Mobile, someInc 
      123-456-3214, Work, someInc 
Foo Barr, 987-654-3211, Home, anotherInc 
[...] 
+2

不這樣做在您的查詢......相反,隱藏呈現值 –

+0

@MichaelFredrickson - 爲什麼? – Harv

回答

3

也許你想變平表:

select n.name, 
     max(case when p.label = 'home' then p.phonenumber end) as PhoneHome, 
     max(case when p.label = 'work' then p.phonenumber end) as PhoneWork, 
     max(case when p.label = 'mobile' then p.phonenumber end) as PhoneMobile 
from names n join 
    phones p 
    on n.nameid = p.nameid 
group by n.name 

這將每種類型的電話號碼放在一個單獨的列中。您需要研究所有不同的標籤以獲得正確的列。

你也可以把所有的電話號碼到一個領域,像「家:0001112222,工作方式:33344455555:

select n.name, 
     group_concat(p.tag||':'||p.phonenumber) as AllNumbers 
from names n join 
    phones p 
    on n.nameid = p.nameid 
group by n.name 
+0

我真的很喜歡這個答案,我會嘗試一下並接受它,如果它能正常工作,謝謝 – Harv

+0

非常感謝Gordon,我最終也選擇了來自電話號碼錶的所有者ID,以及通過名字,姓氏和電話號碼進行分組,結果是如果有三個電話號碼,我會得到3x條目,但是我可以按ID排序/訂購,並對重複項進行後處理容易。我碰到的問題純粹是你的方式沒有修改,如果我說,一個聯繫人的兩個手機號碼;然後我只會得到一條線路,但會丟失一個電話號碼。我決定讓重複和後期處理更好,但是使用大部分代碼讓我到那裏。再次感謝。 – Harv

+0

@哈夫。 。 。我2重複是最大的,你可以調整查詢有'min'和'max'。但是,這並沒有概括,所以後處理可能是最簡單的方法。 –

1

有兩種選擇:

  1. 將數據原樣複製到Excel並應用this question的解決方案。

  2. 略有不同的SQL這樣做,如果你有你的Phones表中的一些獨特的ID,這將工作:

    SELECT 
        CASE t.rank WHEN 1 THEN t.Name ELSE '' END as Name, 
        t.Phone, 
        t.Work 
    FROM (
        SELECT t.*, 
         (
          SELECT COUNT(*) 
          FROM yourTable ti 
          WHERE t.phoneID >= ti.phoneId 
         ) AS rank 
        FROM yourTable t 
        ORDER BY phoneID 
    )