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

Откуда:
Сообщений: 14
Привет,

есть таблица (ID1, ID2), ID не уникальные(в качестве ключа используется пара), нужно выбрать такие записи, у которых ID2 равен заданному, но если нет ни одной пары ID1 с заданным ID2 нужно выбрать ID2 равный допустим 1. Мои попытки селфджойнить таблицу саму на себя не увенчались успехом(нет нулл значений для отсева с помощью coalesce), прошу помочь.
19 июл 16, 19:06    [19428727]     Ответить | Цитировать Сообщить модератору
 Re: выбор записей с ключом по умолчанию  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
alex91,
Зачем селф-джойн?

IF EXISTS (SELECT * FROM T1 WHERE ID2 = @ID2)
	SELECT * FROM T1 WHERE ID2 = @ID2
ELSE
	SELECT * FROM T1 WHERE ID2 = 1

SELECT * FROM T1 WHERE ID2 = @ID2
UNION ALL
SELECT * FROM T1 WHERE ID2 = 1 AND NOT EXISTS (SELECT * FROM T1 WHERE ID2 = @ID2)
19 июл 16, 19:34    [19428813]     Ответить | Цитировать Сообщить модератору
 Re: выбор записей с ключом по умолчанию  [new]
alex91
Member

Откуда:
Сообщений: 14
данные для таблицы(ID1, ID2, ID3)

1, 1, 1
1, 1, 2
1, 2, 1
1, 2, 3
2, 1, 1
2, 1, 4


допустим ID2, был задан как 1, надо вернуть

1, 1, 1
1, 1, 2
2, 1, 1
2, 1, 4


Если был задан ID2=2, тогда

1, 2, 1
1, 2, 3
2, 1, 1
2, 1, 4

Для ID2=3

1, 1, 1
1, 1, 2
2, 1, 1
2, 1, 4

Т.е. для каждой группы ID1, надо вернуть существующие записи где есть нужный ID2(если есть хоть одна пара ID1 ID2, для заданного ID2), если для группы ID1 нет заданного ID2, то надо вернуть все пары ID1, ID2 где ID2=1, т.е. иначе возвращать ID2=1 как значение по умолчанию, я хотел сначала выбрать все записи вообще, потом сделать джойн на эту же таблицу, но с выбранными ID2, потом из тех записей где во второй таблице NULL, взять те, для которых ID2=1
19 июл 16, 22:19    [19429185]     Ответить | Цитировать Сообщить модератору
 Re: выбор записей с ключом по умолчанию  [new]
alex91
Member

Откуда:
Сообщений: 14
Вот что получилось у меня

DECLARE @DEFAULT INT = 1
DECLARE @SEARCH INT = 3

SELECT * FROM 

t as t3

join

    (
        SELECT 
                       ISNULL(t2.ID1, t1.ID1) as ID1, 
                       ISNULL(MIN(t2.ID2), @DEFAULT) as ID2
        FROM
                       t as t1
                       left join
                       (SELECT * FROM t WHERE ID2=@SEARCH) as t2
                       ON t1.ID1 = t2.ID1 AND t1.ID2 = t2.ID2 AND t1.ID3 = t2.ID3
        GROUP by ISNULL(t2.ID1, t1.ID1)

    ) as t4

ON t3.ID1 = t4.ID1 AND t3.ID2 = t4.ID2
19 июл 16, 22:46    [19429262]     Ответить | Цитировать Сообщить модератору
 Re: выбор записей с ключом по умолчанию  [new]
alex91
Member

Откуда:
Сообщений: 14
Работает как надо, но может посоветуете какую-нибудь более скоростную альтернативу
19 июл 16, 22:46    [19429264]     Ответить | Цитировать Сообщить модератору
 Re: выбор записей с ключом по умолчанию  [new]
alex91
Member

Откуда:
Сообщений: 14
DECLARE @DEFAULT INT = 1
DECLARE @SEARCH INT = 3

Можно немного попроще написать не меняя сути

SELECT * FROM

t as t3

join

(
SELECT
ISNULL(t2.ID1, t1.ID1) as ID1,
ISNULL(MIN(t2.ID2), @DEFAULT) as ID2
FROM
t as t1
left join
t as t2
ON t1.ID1 = t2.ID1 AND t1.ID2 = t2.ID2 AND t1.ID3 = t2.ID3 AND ID2=@SEARCH
GROUP by ISNULL(t2.ID1, t1.ID1)

) as t4

ON t3.ID1 = t4.ID1 AND t3.ID2 = t4.ID2
19 июл 16, 22:51    [19429279]     Ответить | Цитировать Сообщить модератору
 Re: выбор записей с ключом по умолчанию  [new]
invm
Member

Откуда: Москва
Сообщений: 9405
alex91
Работает как надо, но может посоветуете какую-нибудь более скоростную альтернативу
Вам уже советовали - 19428813.
Но вы ответов не читаете.
19 июл 16, 23:15    [19429318]     Ответить | Цитировать Сообщить модератору
 Re: выбор записей с ключом по умолчанию  [new]
alex91
Member

Откуда:
Сообщений: 14
Просто оно у меня не заработало как нужно
19 июл 16, 23:20    [19429330]     Ответить | Цитировать Сообщить модератору
 Re: выбор записей с ключом по умолчанию  [new]
alex91
Member

Откуда:
Сообщений: 14
Спасибо, оба предложенных варианта работают, видимо днём неправильно написал запрос и поэтому он не заработал.
19 июл 16, 23:23    [19429334]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить