1

連絡先テーブルがあります:

ID  NAME
--- ----
1   KK
2   JKI
3   HU

そして私は電話テーブルを持っています:

ID  ContactID  Phone  Type
--- ---------  -----  --------
1   1          569    Business
2   1          896    Mobile
3   1          258    Fax
4   2          369    Mobile
5   3          124    Fax
6   2          496    Fax

少なくとも1つの電話番号を持つすべての連絡先を取得したい。表示される電話番号は、ビジネス、使用可能なBusniessタイプがない場合はモバイル、使用可能なモバイルタイプがない場合はFax、それ以外の場合はnullである必要があります。

サンプル結果:

ID  NAME   PHONE
--- ------ ------
1   KK     569   -- Business present
2   JKI    369   -- Business not present but mobile present
3   HU     124   -- only fax present
4

4 に答える 4

4
;WITH [prior](i,t) AS 
(
    SELECT 1, 'Business'
    UNION ALL SELECT 2, 'Mobile'
    UNION ALL SELECT 3, 'Fax'
),
x AS 
(
  SELECT c.ID, c.Name, p.Phone,
    rn = ROW_NUMBER() OVER (PARTITION BY c.ID ORDER BY r.i)
  FROM dbo.Contacts AS c
  LEFT OUTER JOIN dbo.Phone AS p
  ON p.ContactID = c.ID
  LEFT OUTER JOIN [prior] AS r
  ON r.t = p.[Type]
)
SELECT ID, Name, Phone FROM x
WHERE rn = 1;

電話がない連絡先を削除する場合は、の両方のインスタンスをに変更しLEFT OUTERますINNER

于 2012-06-21T22:36:53.403 に答える
3
select  c.ID
,       c.Name
,       coalesce(business.Phone, mobile.Phone, fax.Phone) as Phone
from    Contacts c
left join
        Phone business
on      business.ContactID = c.ID
        and business.type = 'Business'
left join
        Phone mobile
on      mobile.ContactID = c.ID
        and mobile.type = 'Mobile'
left join
        Phone fax
on      fax.ContactID = c.ID
        and fax.type = 'Fax'
where   coalesce(business.Phone, mobile.Phone, fax.Phone) is not null
于 2012-06-21T22:30:14.913 に答える
1

あなたのデータモデルはこれを効率的にクエリするのに適していませんが、これはトリックを行うかもしれません:

SELECT C.ID, C.Name, COALESCE(
    (SELECT TOP 1 P.Phone FROM Phones P WHERE P.ContactID = C.ID AND P.[Type] = 'Business'),
    (SELECT TOP 1 P.Phone FROM Phones P WHERE P.ContactID = C.ID AND P.[Type] = 'Mobile'),
    (SELECT TOP 1 P.Phone FROM Phones P WHERE P.ContactID = C.ID AND P.[Type] = 'Fax')
  ) Phone
  FROM Contacts C
于 2012-06-21T22:30:01.267 に答える
1

私が考えることができる最もコンパクトなソリューションは、

; WITH CTE AS (
    SELECT 
    c.ID, c.NAME, p.Phone
    , r = ROW_NUMBER()OVER(PARTITION BY c.ID ORDER BY CASE p.[TYPE] WHEN 'Business' THEN 1 WHEN 'Mobile' THEN 2 ELSE 3 END)
    FROM Contacts c
    LEFT JOIN Phone p ON p.ContactID = c.ID AND p.[TYPE] IN ('Business','Mobile','Fax')
    WHERE EXISTS(SELECT 1 FROM Phone WHERE ContactID = c.ID)
)
SELECT ID, NAME, Phone
FROM CTE
WHERE r = 1;

このソリューションは、

  • 指定された順序で最初に一致する電話との連絡先
  • 電話番号は存在するが、指定されたタイプのいずれも存在しない場合は、NULL電話番号と連絡してください
  • 電話がまったくない連絡先の結果はありません
于 2012-06-22T02:18:44.653 に答える