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

Откуда: Москва
Сообщений: 584
Имеем таблицу 1
Field_1Field 2
10data1
20data1
30data1
40data1


таблицу 2:

Field_1Field_2
10res3
20res3
30res3


В результате надо получить:
Field_1Field_2
res3 (= Т2.Поле2)data1 (=Т1.Поле2)
40data1


т.е. набор записей, имеющийся в таблице 1 и совпадающий с таким-же набором в таблице 2 (Т1.Поле1 = Т2.Поле1 для всех записей в Т2) свести к одной записи, взяв по одному полю из каждой таблицы.

Что-то никак не соображу как... ?
19 фев 16, 16:27    [18842089]     Ответить | Цитировать Сообщить модератору
 Re: Несколько записей смэппить в одну  [new]
Glory
Member

Откуда:
Сообщений: 104751
И что будет, если таких наборов будет несколько ? Да еще перекрывающихся ?
19 фев 16, 16:35    [18842141]     Ответить | Цитировать Сообщить модератору
 Re: Несколько записей смэппить в одну  [new]
Glory
Member

Откуда:
Сообщений: 104751
Например

таблицу 2:

Field_1Field_2
10res3
20res3
30res3
20res4
30res4
40res4
19 фев 16, 16:36    [18842147]     Ответить | Цитировать Сообщить модератору
 Re: Несколько записей смэппить в одну  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20974
SELECT DISTINCT COALESCE(t2.Field_2, t1.Field_1), t1.Field_2
FROM table1 t1
LEFT JOIN table2 t2 
ON t1.Field_1=t2.Field_1

?
19 фев 16, 16:42    [18842183]     Ответить | Цитировать Сообщить модератору
 Re: Несколько записей смэппить в одну  [new]
basil-77
Member

Откуда: Москва
Сообщений: 584
Glory,
исключено. Для каждого набора в таблице 2 второе поле будет содержать строго одно значение (на самом деле оно вообще будет лежать в другой таблице, в Т2 просто будет приджойнена по ключу)
19 фев 16, 16:54    [18842270]     Ответить | Цитировать Сообщить модератору
 Re: Несколько записей смэппить в одну  [new]
basil-77
Member

Откуда: Москва
Сообщений: 584
Glory,
спасибо, очень похоже на то, что надо... Пойду покурю
COALESCE
19 фев 16, 17:05    [18842326]     Ответить | Цитировать Сообщить модератору
 Re: Несколько записей смэппить в одну  [new]
basil-77
Member

Откуда: Москва
Сообщений: 584
Akina
SELECT DISTINCT COALESCE(t2.Field_2, t1.Field_1), t1.Field_2
FROM table1 t1
LEFT JOIN table2 t2 
ON t1.Field_1=t2.Field_1


?



basil-77
Glory,
спасибо, очень похоже на то, что надо... Пойду покурю


Нет, не то...
При добавлении записей в таблицу 2, например

таблица 2:
Field_1Field_2
10res3
20res3
30res3
40res3


В результате получаем тоже самое:
Field_1Field_2
res3data1
40data1


а должно быть в этом случае
Field_1Field_2
10data1
20data1
30data1
40data1

т.к. таблица 1 уже не содержит полного набора, который есть в т2
19 фев 16, 17:15    [18842379]     Ответить | Цитировать Сообщить модератору
 Re: Несколько записей смэппить в одну  [new]
basil-77
Member

Откуда: Москва
Сообщений: 584
Ошибся.. вот так т2:
basil-77
таблица 2:
Field_1Field_2
10res3
20res3
30res3
60res3
19 фев 16, 17:17    [18842389]     Ответить | Цитировать Сообщить модератору
 Re: Несколько записей смэппить в одну  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20974
basil-77, до тех пор, пока Вы не соберёте мозги в кучку и не сформулируете ЗАДАЧУ, никто Вам не поможет. Телепатов не существует. А всё то, что Вы писали выше - это жалкие ошмётки задачи. То есть непригодная к работе фигня.
19 фев 16, 18:01    [18842661]     Ответить | Цитировать Сообщить модератору
 Re: Несколько записей смэппить в одну  [new]
basil-77
Member

Откуда: Москва
Сообщений: 584
Попробую сформулировать иначе:
Есть две таблицы. Первая содержит два поля и множество записей (поле 2 - одно значение для всех записей). Вторая содержит тоже два поля и некий набор записей (поле 2 - одно для всех записей).
Необходимо: если множество записей из второй таблицы (по первому полю) полностью содержится во множестве записей первой таблицы (по первому полю), т.е. для всех из Т2 выполняется Т2.Поле1 = Т1.Поле1 (но в Т1 это могут быть как все записи, так и их часть) то сформировать результат - одна строка: Поле1 = Т2.Поле2, Поле2 = Т1.Поле1.
Если в Т1 остались строки, не вошедшие в множество из Т2, то они также включаются в результат без изменений.
20 фев 16, 09:23    [18844340]     Ответить | Цитировать Сообщить модератору
 Re: Несколько записей смэппить в одну  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20974
basil-77
Первая содержит два поля и множество записей (поле 2 - одно значение для всех записей).
Т.е. Поле 1 - неуникально. Поле 2 - неуникально. А пара (поле 1, поле 2) - она уникальна или нет?

basil-77
Вторая содержит тоже два поля и некий набор записей (поле 2 - одно для всех записей).
Тот же вопрос.

basil-77
если множество записей из второй таблицы (по первому полю) полностью содержится во множестве записей первой таблицы (по первому полю), т.е. для всех из Т2 выполняется Т2.Поле1 = Т1.Поле1 (но в Т1 это могут быть как все записи, так и их часть)
Не понял... значение второго поля при этом не учитывается?

basil-77
Если в Т1 остались строки, не вошедшие в множество из Т2, то они также включаются в результат без изменений.
Бессмысленно без ответа на предыдущий вопрос, но... А если в Т2 "остались строки, не вошедшие в множество из Т1"?
20 фев 16, 09:29    [18844357]     Ответить | Цитировать Сообщить модератору
 Re: Несколько записей смэппить в одну  [new]
basil-77
Member

Откуда: Москва
Сообщений: 584
Akina
Т.е. Поле 1 - неуникально. Поле 2 - неуникально. А пара (поле 1, поле 2) - она уникальна или нет?

Да
По второй таблице: поле 1 уникально, поле 2 - не уникально, но имеет одно значение для всех записей. Пара (п1, п2) соответственно тоже уникальна.


Akina
Не понял... значение второго поля при этом не учитывается?

Нет. Сравнение только по полю1.


Akina
А если в Т2 "остались строки, не вошедшие в множество из Т1"?

Такого не должно быть. "Замена" производится только при условии, что Т2.Поле1 полностью(!) содержится в Т1.Поле1.
Если оказывается, что только часть Т2 совпадает с Т1 - то никаких действий не производим и результат, по сути, будет равен исходной Т1.
А вот если в Т1 остались строки, не вошедшие в Т2 - то они прибавляются к результату.

Иными словами - задача в том, чтобы множество записей из Т1 "смэппить" в одну по шаблону из Т2.
20 фев 16, 09:41    [18844389]     Ответить | Цитировать Сообщить модератору
 Re: Несколько записей смэппить в одну  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20974
basil-77
поле 2 - не уникально, но имеет одно значение для всех записей.

Это определяется наложенным на таблицу CONSTRAINT?

basil-77
Такого не должно быть.

Это определяется наложенным на таблицу CONSTRAINT?

PS. Всё, что не ограничено соответствующими правилами контроля - ничем не подтверждённая ерунда. Достаточно одного недоадмина-идиота.
20 фев 16, 10:13    [18844514]     Ответить | Цитировать Сообщить модератору
 Re: Несколько записей смэппить в одну  [new]
basil-77
Member

Откуда: Москва
Сообщений: 584
Akina,
Это подтверждается бизнес-логикой. Иначе просто быть не может. (там поля - Первое - UserTeam, второе - User). Выборка осуществляется для каждого пользователя в отдельности.
20 фев 16, 10:19    [18844537]     Ответить | Цитировать Сообщить модератору
 Re: Несколько записей смэппить в одну  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20974
Итого, имеем
create table table1(field1, field2, index(field1,field2) unique)
create table table2(field1, field2, index(field1) unique)

плюс некие внешние силы гарантируют, что
(select count(distinct field2) from table2) = 1


В этих условиях я лично не вижу возможности реализовать всё это одним запросом - вернее, это, наверное, получится, но уж больно многоэтажное выйдет безобразие. Я бы предложил проверку на полное вхождение и два разных запроса в рамках ХП в зависимости от результата проверки.
20 фев 16, 10:59    [18844780]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить