0

私は次のクエリを持っています:

   SELECT pn.PhoneId,
       pn.CountryId,
       c.ITUCode,
       pn.AreaCode,
       pn.PhoneNumber,
       pn.PhoneExtension,
       pn.PhoneNumberTypeId,
       pnt.PhoneNumberType,
       pn.Comments,
       ppn.IsPrimaryNumber,
       cpn.IsPrimaryNumber
FROM PhoneNumbers AS pn
INNER JOIN PeoplePhoneNumbers AS ppn ON ppn.PhoneId = pn.PhoneId
INNER JOIN CompanyPhoneNumbers AS cpn ON cpn.PhoneId = pn.PhoneId
INNER JOIN Countries AS c ON c.CountryId = pn.CountryId
INNER JOIN PhoneNumberTypes AS pnt ON pnt.PhoneNumberTypeId = pn.PhoneNumberTypeId
WHERE pn.PhoneId = @PhoneId
ORDER BY ppn.IsPrimaryNumber DESC, pnt.PhoneNumberType

フェッチすることができるので、 IsPrimaryKey2つの異なる値を使用innerjoinsして、そこから2つの値を取得する必要があります。

それらの1つはそうでnullあり、他は常にそうである値を持っているでしょう。

したがって、このクエリを両方の単一の結合に変更してから、他のフィールドではなく、innerjoin単一のフィールドをフェッチすることはできますか?IsPrimaryNumber

ありがとう

4

1 に答える 1

0

LEFT JOIN次のように、2つのテーブルppnを1つの列に配置しますcpnCOALESCE

SELECT 
  pn.PhoneId, 
  pn.CountryId, 
  c.ITUCode, 
  pn.AreaCode, 
  pn.PhoneNumber, 
  pn.PhoneExtension,
  pn.PhoneNumberTypeId, 
  pnt.PhoneNumberType, 
  pn.Comments, 
  COALESCE(ppn.IsPrimaryNumber, cpn.IsPrimaryNumber) IsPrimaryNumber
FROM PhoneNumbers AS pn
INNER JOIN Countries          AS c   ON c.CountryId = pn.CountryId
INNER JOIN PhoneNumberTypes   AS pnt 
        ON pnt.PhoneNumberTypeId = pn.PhoneNumberTypeId
LEFT JOIN PeoplePhoneNumbers  AS ppn ON ppn.PhoneId = pn.PhoneId
LEFT JOIN CompanyPhoneNumbers AS cpn ON cpn.PhoneId = pn.PhoneId
WHERE pn.PhoneId = @PhoneId
ORDER BY ppn.IsPrimaryNumber DESC, pnt.PhoneNumberType;
于 2013-01-14T12:32:23.253 に答える