У меня есть две следующие таблицы:

Обменный курс (T1)

CurrencyCode    Rate
CHF             6.9660
EUR             7.4445
GBP             8.2569
NOK             0.6686

Заказчик (T2)

CustomerNo   Name  Address     City    CurrencyCode
Test001      Test  1/2 Test     TA       NOK
Test002      Test  1/2 Test     EU       EUR

Я хочу результат ниже

CurrencyCode CustomerNo   City   
CHF           NULL        NULL
EUR           NULL        NULL 
GBP           NULL        NULL 
NOK           Test001      TA
CHF           NULL        NULL
EUR           Test002      EU 
GBP           NULL        NULL 
NOK           NULL        NULL 

Я пробовал этот запрос

Select Er.CurrencyCode,Ca.CurrencyCode
From 
ExchangeRate Er
Left Outer Join Customer As Ca With(NoLock) On Ca.CurrencyCode=Er.CurrencyCode
where CA.CustomerCode='Test001'

Но я получил этот результат

CurrencyCode CustomerNo   City   
NOK           Test001      TA

Мне нужен результат типа Cross Join. Пожалуйста, помогите мне решить эту проблему.

0
KIR 1 Дек 2020 в 09:45

3 ответа

Лучший ответ

Используйте cross join с выражением case, чтобы определить, отображать ли результаты или нет.

select Er.CurrencyCode
  , case when Ca.CurrencyCode = Er.CurrencyCode then Ca.CustomerNo end CustomerNo
  , case when Ca.CurrencyCode = Er.CurrencyCode then Ca.City end City
from ExchangeRate Er
cross join Customer Ca
where CA.CustomerCode = 'Test001'

Примечание. Не используйте nolock, если только вы совершенно не обязаны и не знаете о возможных последствиях.

0
Dale K 1 Дек 2020 в 07:02

Ваш запрос в основном в порядке. Вам просто нужно переместить условие фильтра в предложение on:

Select Er.CurrencyCode, Ca.CurrencyCode
From ExchangeRate Er left join
     Customer Ca
     On Ca.CurrencyCode = Er.CurrencyCode and
        CA.CustomerCode = 'Test001'
0
Gordon Linoff 1 Дек 2020 в 13:22

Просто переместите свое условие CA.CustomerCode='Test001' в JOIN вместо WHERE, чтобы оно вернуло все строки из ExchangeRate и CustomerNo & amp; City, когда CustomerCode = 'Test001' имеет соответствие CurrencyCode.

Select Er.CurrencyCode, Ca.CurrencyCode, Ca.CustomerNo, Ca.City
From ExchangeRate Er
Left Outer Join Customer As Ca With(NoLock) 
    On Ca.CurrencyCode = Er.CurrencyCode

В качестве альтернативы вы можете обновить условие WHERE и добавить OR CA.CustomerNo IS NULL, как показано ниже.

Select Er.CurrencyCode, Ca.CurrencyCode, Ca.CustomerNo, Ca.City
From ExchangeRate Er
Left Outer Join Customer As Ca With(NoLock) 
    On Ca.CurrencyCode = Er.CurrencyCode
WHERE CA.CustomerCode = 'Test001' OR CA.CustomerNo IS NULL
0
Karan 1 Дек 2020 в 06:53