1

我不精通 SQL 或 SQLITE。

我正在运行一个简单的选择和加入语句。我基本上是从 sqlite3 数据库中提取联系人并手动转储到 csv 中。

我遇到的问题是,我在一张表中有姓名和 ID,在另一张表中有电话号码和标签。其中,label 表示“Mobile”、“Work”等。

因此,我将名称的 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
[...]
4

2 回答 2

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

这会将每种类型的电话号码放在单独的列中。您需要研究所有不同的标签以获得正确的列。

您也可以将所有电话号码放在一个字段中,例如“home:0001112222,work: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
于 2013-01-12T02:22:21.837 回答
1

有两种选择:

  1. 将数据原样复制到 Excel 并应用此问题的解决方案。

  2. 如果您的Phones表上有一些唯一 ID,则使用稍微不同的 SQL 来执行此操作:

    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
    )
    
于 2013-01-11T22:42:35.983 回答