Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 помогите с секолькими джойнами к одной таблице  [new]
gen-217
Member

Откуда:
Сообщений: 325
select m.MemberId, m1.CurrencyId, m2.CurrencyId, m3.CurrencyId from tb_Member m
LEFT JOIN tb_MemberCurrency m1
	ON m1.MemberId=m.MemberId AND m1.ProductId=1 AND m1.IsDefaultProduct=1
LEFT JOIN tb_MemberCurrency m2
	ON m2.MemberId=m.MemberId AND m2.ProductId=2 AND m2.IsDefaultProduct=1
LEFT JOIN tb_MemberCurrency m3
	ON m3.MemberId=m.MemberId AND m3.ProductId=3 AND m3.IsDefaultProduct=1
 WHERE m.MemberId=299

как можно упростить и не потерять в производительности?
MS SQL 2005
18 авг 09, 18:39    [7553391]     Ответить | Цитировать Сообщить модератору
 Re: помогите с секолькими джойнами к одной таблице  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
За производительность не скажу, но имхо проще
select 299
      ,min(case when mm.ProductId = 1 then mm.CurrencyId else null end)
      ,min(case when mm.ProductId = 2 then mm.CurrencyId else null end)
      ,min(case when mm.ProductId = 3 then mm.CurrencyId else null end)
  from tb_Member m
  LEFT JOIN tb_MemberCurrency mm ON mm.MemberId=m.MemberId 
                                AND mm.ProductId IN (1, 2, 3) 
                                AND mm.IsDefaultProduct=1
  WHERE m.MemberId = 299
18 авг 09, 18:45    [7553409]     Ответить | Цитировать Сообщить модератору
 Re: помогите с секолькими джойнами к одной таблице  [new]
iljy
Member

Откуда:
Сообщений: 8711
gen-217,

упростить? или не потерять?

улучшить производительность можно например так:

select m.MemberId, Currency1, Currency2, Currency3
from tb_Member m
LEFT JOIN

(select MemberId, [1] Currency1, [2] Currency2, [3] Currency3
 from tb_MemberCurrency m1
 pivot
 ( min(CurrencyId) for ProductId in ([1],[2],[3])) t
) m1
	ON m1.MemberId=m.MemberId AND m1.IsDefaultProduct=1
 WHERE m.MemberId=299

но как и всегда - обсуждать производительность надо предметно, со скриптами таблиц, планами, индексами и т.п.
18 авг 09, 18:52    [7553427]     Ответить | Цитировать Сообщить модератору
 Re: помогите с секолькими джойнами к одной таблице  [new]
iljy
Member

Откуда:
Сообщений: 8711
gen-217,

кстати, если вы выбираете только для одного MemberId - зачем вообще первая таблица? Только проверить его наличие?
18 авг 09, 18:54    [7553436]     Ответить | Цитировать Сообщить модератору
 Re: помогите с секолькими джойнами к одной таблице  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Сейчас только подумал, что не сказал автору одну важную вещь
мой запрос не может вернуть более одной строки, а исходный запрос - в принципе может
если тому не помешают констрейнты, про которые автор почему-то ничего не сказал
Рекомендую обратить внимание
(ато я в погоне за простотой что-то увлекся)
18 авг 09, 18:56    [7553446]     Ответить | Цитировать Сообщить модератору
 Re: помогите с секолькими джойнами к одной таблице  [new]
iljy
Member

Откуда:
Сообщений: 8711
Паганель,

+1. Нужны скрипты, ключи и т.д. А то мы щаз напридумываем
18 авг 09, 19:00    [7553458]     Ответить | Цитировать Сообщить модератору
 Re: помогите с секолькими джойнами к одной таблице  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
gen-217
select m.MemberId, m1.CurrencyId, m2.CurrencyId, m3.CurrencyId from tb_Member m
LEFT JOIN tb_MemberCurrency m1
	ON m1.MemberId=m.MemberId AND m1.ProductId=1 AND m1.IsDefaultProduct=1
LEFT JOIN tb_MemberCurrency m2
	ON m2.MemberId=m.MemberId AND m2.ProductId=2 AND m2.IsDefaultProduct=1
LEFT JOIN tb_MemberCurrency m3
	ON m3.MemberId=m.MemberId AND m3.ProductId=3 AND m3.IsDefaultProduct=1
 WHERE m.MemberId=299

как можно упростить и не потерять в производительности?
MS SQL 2005

что упростить то хотите?
18 авг 09, 19:36    [7553585]     Ответить | Цитировать Сообщить модератору
 Re: помогите с секолькими джойнами к одной таблице  [new]
gen-217
Member

Откуда:
Сообщений: 325
не ну я понял что не достаточно описал проблему. всем спасибо
18 авг 09, 19:53    [7553618]     Ответить | Цитировать Сообщить модератору
 Re: помогите с секолькими джойнами к одной таблице  [new]
gen-217
Member

Откуда:
Сообщений: 325
придеца вернутся к старой теме
select m.MemberId, m1.CurrencyId, m2.CurrencyId, m3.CurrencyId from tb_Member m
LEFT JOIN tb_MemberCurrency m1
	ON m1.MemberId=m.MemberId AND m1.ProductId=1 AND m1.IsDefaultProduct=1
LEFT JOIN tb_MemberCurrency m2
	ON m2.MemberId=m.MemberId AND m2.ProductId=2 AND m2.IsDefaultProduct=1
LEFT JOIN tb_MemberCurrency m3
	ON m3.MemberId=m.MemberId AND m3.ProductId=3 AND m3.IsDefaultProduct=1

есть такой запрос как выйти из проблемы с множеством LEFT JOIN?
запрос выполняется не по одному мерберу а по многим
9 сен 09, 15:43    [7637766]     Ответить | Цитировать Сообщить модератору
 Re: помогите с секолькими джойнами к одной таблице  [new]
iljy
Member

Откуда:
Сообщений: 8711
gen-217,

вам уже приводиле варианты решения, чем не подошли?
9 сен 09, 15:45    [7637784]     Ответить | Цитировать Сообщить модератору
 Re: помогите с секолькими джойнами к одной таблице  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
gen-217
есть такой запрос как выйти из проблемы с множеством LEFT JOIN?
в чем проблема-то?
9 сен 09, 15:45    [7637785]     Ответить | Цитировать Сообщить модератору
 Re: помогите с секолькими джойнами к одной таблице  [new]
Glory
Member

Откуда:
Сообщений: 104760
gen-217

есть такой запрос как выйти из проблемы с множеством LEFT JOIN?

И какая же тут проблема с множеством LEFT JOIN?
9 сен 09, 15:46    [7637797]     Ответить | Цитировать Сообщить модератору
 Re: помогите с секолькими джойнами к одной таблице  [new]
gen-217
Member

Откуда:
Сообщений: 325
паганель сказал что его способ работает только для 1-го MemberId
А проблема в том что не хочица джойны лпепить по 3 шт едентичных таблицы большие будет медленно работать :(
9 сен 09, 15:49    [7637813]     Ответить | Цитировать Сообщить модератору
 Re: помогите с секолькими джойнами к одной таблице  [new]
gen-217
Member

Откуда:
Сообщений: 325
Glory,

не хочитца деалть несколько джойнов к одной таблице, хочится как то это обойти. это возможно?
9 сен 09, 15:50    [7637823]     Ответить | Цитировать Сообщить модератору
 Re: помогите с секолькими джойнами к одной таблице  [new]
Glory
Member

Откуда:
Сообщений: 104760
gen-217
Glory,

не хочитца деалть несколько джойнов к одной таблице, хочится как то это обойти. это возможно?

Т.е. вы предлагаете решить какую то сферическую задачу избавления от join-ов ?
Т.е. вам не важен конечный результат, лишь бы в тексте запроса не было join-ов ?
9 сен 09, 15:54    [7637852]     Ответить | Цитировать Сообщить модератору
 Re: помогите с секолькими джойнами к одной таблице  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
скрипты создания таблиц (и констрейнтов на них) приведите, пожалуйста
9 сен 09, 15:55    [7637862]     Ответить | Цитировать Сообщить модератору
 Re: помогите с секолькими джойнами к одной таблице  [new]
iljy
Member

Откуда:
Сообщений: 8711
gen-217
паганель сказал что его способ работает только для 1-го MemberId
А проблема в том что не хочица джойны лпепить по 3 шт едентичных таблицы большие будет медленно работать :(


вы изначально просили для одного - вам выдали для одного. Надо для многих - уберите проверку WHERE m.MemberId=299 и поставьте GROUP BY m.MemberID для решения Паганеля, для моего даже этого не понадобится.
9 сен 09, 16:12    [7637981]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить