powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Связать две таблицы join'ом при связи 1:М.
25 сообщений из 56, страница 1 из 3
Связать две таблицы join'ом при связи 1:М.
    #40034559
RonaldLRivest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть две таблицы Детали и Тестирование.
Нужно вывести все детали, не проходящие тестирование в определённом году. Есть 2 особенности:
1. Есть детали которые вообще не проходят тестирование, их надо выводить тоже;
2. Есть детали которые проходят тестирование по много раз, и таких много. Связь 1 : М.
Написал вот такой запрос:

select distinct name
from Detales dt
left join Testing ts on ts.ID_Detail = dt.ID
where ts.DateBegin not like '%2015%'

Но из-за второй особенности выборка получается неверная, выводятся детали которые были протестированы. Переписал вот так :
select name
from Detales dt
where dt.ID <> (select distinct ID_Detale
from Testing ts
where ts.DateBegin like '%2015%')
Работает, но такой запрос слишком громоздкий. Как можно написать его используя один селект?
...
Рейтинг: 0 / 0
Связать две таблицы join'ом при связи 1:М.
    #40034560
Фотография Ennor Tiegael
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RonaldLRivest,

Код: sql
1.
2.
3.
4.
select d.*
from dbo.Details d
  left join dbo.Testing t on t.ID_Detail = d.ID and t.DateBegin between '20150101' and '20151231'
where t.ID_Detail is null;

При внешнем соединении таблицы все условия фильтрации по ней должны быть в кляузе ON. Если вы помещаете их в WHERE, ваш left join превращается в inner.
...
Рейтинг: 0 / 0
Связать две таблицы join'ом при связи 1:М.
    #40034561
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ennor Tiegael
Если вы помещаете их в WHERE, ваш left join превращается в inner.
Сами себе противоречите
Главное, чтобы значения NULL сравнивались в WHERE только операторами IS NULL или IS NOT NULL
...
Рейтинг: 0 / 0
Связать две таблицы join'ом при связи 1:М.
    #40034564
RonaldLRivest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ennor Tiegael,

Не работает так к сожалению. С таким where выводятся только детали, не участвующие в тестировании. Это правильно, но еще надо выводить остальные детали, которые участвуют в тестировании, но не в конкретном году.
...
Рейтинг: 0 / 0
Связать две таблицы join'ом при связи 1:М.
    #40034565
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
with dt as ( select * from Detales )
   , ts as ( select * from Testing where DateBegin like '%2015%')
   select * from dt where not exists( select * from ts where dt.id <> ts.ID_Detale )
...
Рейтинг: 0 / 0
Связать две таблицы join'ом при связи 1:М.
    #40034567
RonaldLRivest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222,

С некоторыми поправками (not exists на exists) этот запрос работает правильно. Но он практически такой же, как тот, который хочу упростить) У него тоже несколько селектов)
...
Рейтинг: 0 / 0
Связать две таблицы join'ом при связи 1:М.
    #40034569
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RonaldLRivest
aleks222,

С некоторыми поправками (not exists на exists) этот запрос работает правильно. Но он практически такой же, как тот, который хочу упростить) У него тоже несколько селектов)

Качество запроса измеряется не числом селектов в нем, а временем исполнения.
Вольно вам заниматься фигней.
...
Рейтинг: 0 / 0
Связать две таблицы join'ом при связи 1:М.
    #40034570
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222,

если деталей тысяч сто, а тестирований по миллиону в году, Ваш запрос будет чистый треш.
...
Рейтинг: 0 / 0
Связать две таблицы join'ом при связи 1:М.
    #40034571
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RonaldLRivest,

пример данных дайте. Потому что запрос Ennor Tiegae верен только в случае верного предположения, в каком формате у Вас хранятся даты.
...
Рейтинг: 0 / 0
Связать две таблицы join'ом при связи 1:М.
    #40034573
RonaldLRivest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ptr128,
Даты храняться в varchar.
...
Рейтинг: 0 / 0
Связать две таблицы join'ом при связи 1:М.
    #40034574
RonaldLRivest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222,

Это больше академическая задача чем практическая.
...
Рейтинг: 0 / 0
Связать две таблицы join'ом при связи 1:М.
    #40034575
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222
Качество запроса измеряется не числом селектов в нем, а временем исполнения.

Во-первых, не временем исполнения, а временем загрузки CPU и IO. Обычно, лучше иметь запрос выполняющийся на 10-20% дольше на одном ядре, чем выполняющийся быстрее, но на 32-х ядрах.
Во-вторых, конструкцию LIKE '%...' следет избегать всеми силами. Потому что, в лучшем случае, она подразумевает полное сканирование кластерного индекса, а в худшем - сканирование всей таблицы.
...
Рейтинг: 0 / 0
Связать две таблицы join'ом при связи 1:М.
    #40034576
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RonaldLRivest,

точнее. Приведите примеры хотя бы нескольких строк данных каждой таблицы.
...
Рейтинг: 0 / 0
Связать две таблицы join'ом при связи 1:М.
    #40034577
RonaldLRivest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Связать две таблицы join'ом при связи 1:М.
    #40034578
RonaldLRivest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо всем.
...
Рейтинг: 0 / 0
Связать две таблицы join'ом при связи 1:М.
    #40034579
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RonaldLRivest,

это опять уход в Table Scan/Clustered Index Scan. Не стоит так делать.

P.S. Нет вру. Если индекс по ID_Detail еще пройдет. Но при сравнении все равно лучше избегать функций со стороны присоединяемой таблицы.
...
Рейтинг: 0 / 0
Связать две таблицы join'ом при связи 1:М.
    #40034580
RonaldLRivest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ptr128,

Да, согласен. Но в данном случае этот пример больше академический чем практический, нужно именно локаничный и понятный, минимальный запрос. Спасибо вам. Если есть варианты, лишними не будут.
...
Рейтинг: 0 / 0
Связать две таблицы join'ом при связи 1:М.
    #40034581
Фотография Ennor Tiegael
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RonaldLRivest
еще надо выводить остальные детали, которые участвуют в тестировании, но не в конкретном году.
Ни хрена не понял. Давайте пример данных и желаемый результат, предпочтительно в SQL-виде.
...
Рейтинг: 0 / 0
Связать две таблицы join'ом при связи 1:М.
    #40034583
RonaldLRivest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ennor Tiegael,

вот здесь результат можно посмотреть https://ru.stackoverflow.com/questions/1229276/Связать-две-таблицы-joinом-при-связи-1М
...
Рейтинг: 0 / 0
Связать две таблицы join'ом при связи 1:М.
    #40034584
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ennor Tiegael,

судя по тому, как запрос по ссылке лихо преобразовал строку в дату, она там в ISO формате )
...
Рейтинг: 0 / 0
Связать две таблицы join'ом при связи 1:М.
    #40034585
RonaldLRivest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ennor Tiegael,

Да, я неправильно вам ответил, where у вас правильный был. Дело в соединении было.
...
Рейтинг: 0 / 0
Связать две таблицы join'ом при связи 1:М.
    #40034588
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RonaldLRivest,

Вот и используйте запрос Ennor Tiegael. К нему у меня претензий по оптимальности нет. При правильных индексах, само собой.
...
Рейтинг: 0 / 0
Связать две таблицы join'ом при связи 1:М.
    #40034589
RonaldLRivest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ennor Tiegael,

Извиняюсь. Сейчас проверил, ваш запрос верен, я сам его походу случайно в первый раз переделал. Сам виноват.
...
Рейтинг: 0 / 0
Связать две таблицы join'ом при связи 1:М.
    #40034614
Фотография Ennor Tiegael
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RonaldLRivest,

А, окей. Бывает. Удачи.
...
Рейтинг: 0 / 0
Связать две таблицы join'ом при связи 1:М.
    #40034623
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128
aleks222,

если деталей тысяч сто, а тестирований по миллиону в году, Ваш запрос будет чистый треш.


Балоболить изволите?
Дык балаболить - не мешки ворочать запросы писать.
...
Рейтинг: 0 / 0
25 сообщений из 56, страница 1 из 3
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Связать две таблицы join'ом при связи 1:М.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]