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

Откуда:
Сообщений: 199
Всем привет!
Вообщем, имеем таблицу с разнородными идентификаторами:
ID1ID2ID3
1-O2-C456
2-ONULL234
NULL3-CNULL

И есть другая таблица, которая содержит в себе данные с несколькими приоритетами:
ID1ID2ID3NAMEPRIORITY
1-O 2-C 456 A1 2
1-O NULL 456 A2 1
NULL 2-C NULL A3 4

Эти данные нужно приджойнить (или приселектить) к таблице с идентификаторами (данные должны иметь наименьшее значение для поля PRIORITY) таким образом, чтобы оставить количество записей в таблице с идентификаторами неизменным. Сейчас я делаю это посредством следующего селекта:
SELECT t.ID1, t.ID2, t.ID3,
    (SELECT TOP 1 NAME
     FROM DTABLE
     WHERE PRIORITY = (SELECT MIN(PRIORITY)
                                 FROM DTABLE
                                 WHERE NAME IS NOT NULL
                                 AND ((ID1 = t.ID1 AND ID2 = t.ID2 AND ID3 = t.ID3)
                                        OR (ID1 = t.ID1 AND ID2 = t.ID2 AND ID3 IS NULL)
                                        OR (ID1 = t.ID1 AND ID2 IS NULL AND ID3 IS NULL)
                                        OR (ID1 = t.ID1 AND ID2  IS NULL AND ID3 = t.ID3)
                                        OR (ID1 IS NULL AND ID2 = t.ID2 AND ID3 = t.ID3)
                                        OR (ID1  IS NULL AND ID2 = t.ID2 AND ID3  IS NULL)
                                        OR (ID1  IS NULL AND ID2  IS NULL AND ID3 = t.ID3))
               AND ((ID1 = t.ID1 AND ID2 = t.ID2 AND ID3 = t.ID3)
                        OR (ID1 = t.ID1 AND ID2 = t.ID2 AND ID3 IS NULL)
                        OR (ID1 = t.ID1 AND ID2 IS NULL AND ID3 IS NULL)
                        OR (ID1 = t.ID1 AND ID2  IS NULL AND ID3 = t.ID3)
                        OR (ID1 IS NULL AND ID2 = t.ID2 AND ID3 = t.ID3)
                        OR (ID1  IS NULL AND ID2 = t.ID2 AND ID3  IS NULL)
                        OR (ID1  IS NULL AND ID2  IS NULL AND ID3 = t.ID3)) AS NAME
FROM IDTABLE AS t

Плюс подобные селекты на каждое поле (около 15-ти).
Вопрос такой: как это можно сделать джойном (или может есть способ получше? :) ), включив в условие джойна конструкцию, подобную TOP 1? Поскольку, если просто джойнить к таблице с идентификаторами таблицу с данными, в которой окажутся записи вида:
ID1ID2ID3NAMEPRIORITY
1-O 2-C 456 A1 1
1-O 2-С 456 A1_ 1

то в итоговом результате мы получим две строчки на одну строку из идентификационной таблички.
Заранее извиняюсь за некую сумбурность в вопросе, он уже все нервы вымотал. Спасибо.
5 ноя 13, 12:29    [15077895]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать по составным идентификаторам наиболее приоритетные данные  [new]
Добрый Э - Эх
Guest
[cross | outer] apply?
5 ноя 13, 12:32    [15077921]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать по составным идентификаторам наиболее приоритетные данные  [new]
SiNtez_26
Member

Откуда:
Сообщений: 199
Спасибо, пробуем.
5 ноя 13, 12:49    [15078041]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать по составным идентификаторам наиболее приоритетные данные  [new]
SiNtez_26
Member

Откуда:
Сообщений: 199
Спасибо, использование OUTER APPLY понравилось, хотя из-за монструозного условия производительность все равно оставляет желать лучшего (хотя мы получили в два раза большую скорость работы запроса, если сравнивать с предыдущим вариантом). Может ли кто-нибудь предложить хотя бы небольшие изменения условий выборки?
5 ноя 13, 13:28    [15078337]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать по составным идентификаторам наиболее приоритетные данные  [new]
Добрый Э - Эх
Guest
вложенный подзапрос на поиск минимума по приоритету также переписать...
либо через все тот же APPLY, либо любым подходящим из указанных тут способов.
5 ноя 13, 13:42    [15078462]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать по составным идентификаторам наиболее приоритетные данные  [new]
SiNtez_26
Member

Откуда:
Сообщений: 199
Добрый Э - Эх
вложенный подзапрос на поиск минимума по приоритету также переписать...
либо через все тот же APPLY, либо любым подходящим из указанных тут способов.

Уже отказались от него, используем OUTER APPLY, внутри которого выбирается приоритетное значение поля с сортировкой по PRIORITY.
5 ноя 13, 14:07    [15078646]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать по составным идентификаторам наиболее приоритетные данные  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1873
А зачем еще одна тема ???
Сложный апдейт двух десятков полей при 4 млн. записей
5 ноя 13, 14:26    [15078835]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить