powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Left Join и условие по правой таблице
19 сообщений из 19, страница 1 из 1
Left Join и условие по правой таблице
    #39735616
Beltar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дано:
Таблица оборудования, в ней поля: Id, Название.
Таблица выработки, при создании единицы продукции в нее помещается новая запись с Id_станка на котором собрали.

Я хочу выбрать распределение выработки по станкам, в т. ч. и тем станкам, по которым выработка отсутствует.

Т. е. если есть станок 1 с выр-кой 10, станок 2 с выр-кой 15 и станок 3 с выр-кой 0 я делаю запрос

Код: sql
1.
2.
3.
Select Оборудование.Id, Оборудование.Название, Count(Выработка.Id) From Оборудование
Left Join Выработка on Оборудование.Id=Выработка.Id_Оборудование
Group By  Оборудование.Id, Оборудование.Название



Получаю, как и написано в инструкции к Join, результат вида:
1 "Станок 1" 10
2 "Станок 2" 15
3 "Станок 3" 0

Но если я добавлю к правой таблице условие, например

Код: sql
1.
2.
3.
4.
Select Оборудование.Id, Оборудование.Название, Count(Выработка.Id) From Оборудование
Left Join Выработка on Оборудование.Id=Выработка.Id_Оборудование
Where Выработка.Время>'2018.01.01'
Group By  Оборудование.Id, Оборудование.Название



То я уже получаю результат вида:
1 "Станок 1" 10
2 "Станок 2" 15

Меня это не устраивает. Как обойти?
...
Рейтинг: 0 / 0
Left Join и условие по правой таблице
    #39735619
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Beltar,

предикат в ON перенести. Вы сейчас получаете INNER JOIN
...
Рейтинг: 0 / 0
Left Join и условие по правой таблице
    #39735622
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Beltar,

Надо накладывать не общий фильтр на выборку, в только на таблицу, в которой происходит объединение. Т.е. where заменить на and.
...
Рейтинг: 0 / 0
Left Join и условие по правой таблице
    #39735629
Beltar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Переписал в виде

Код: sql
1.
2.
3.
Select Оборудование.Id, Оборудование.Название, Count(Выработка.Id) From Оборудование
Left Join Выработка on (Оборудование.Id=Выработка.Id_Оборудование and Выработка.Время>'2018.01.01')
Group By  Оборудование.Id, Оборудование.Название



Спс большое.
...
Рейтинг: 0 / 0
Left Join и условие по правой таблице
    #39735716
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав КолосовBeltar,

Надо накладывать не общий фильтр на выборку, в только на таблицу, в которой происходит объединение. Т.е. where заменить на and.Или добавить в WHERE ... OR Выработка.Id IS NULL.

Кстати, а что должен вернуть COUNT()? Каковы ваши ожидания?
...
Рейтинг: 0 / 0
Left Join и условие по правой таблице
    #39735745
Beltar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Количество записей для каждого Id_Оборудования.

авторВыработка.Id IS NULL.

Id - первичный ключ.
...
Рейтинг: 0 / 0
Left Join и условие по правой таблице
    #39735746
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BeltarКоличество записей для каждого Id_Оборудования.

авторВыработка.Id IS NULL.

Id - первичный ключ.
Приборы?
300!
...
Рейтинг: 0 / 0
Left Join и условие по правой таблице
    #39735841
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BeltarКоличество записей для каждого Id_Оборудования.Надеюсь, игнорирование Выработка.Id IS NULL - это то, что вам нужно?
...
Рейтинг: 0 / 0
Left Join и условие по правой таблице
    #39735842
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BeltarКоличество записей для каждого Id_Оборудования.

авторВыработка.Id IS NULL.

Id - первичный ключ.LEFT JOIN возвращает все поля правой таблицы равными NULL, если подходящая строка не найдена.
PK в этом случае ничего не значит.
...
Рейтинг: 0 / 0
Left Join и условие по правой таблице
    #39735856
Beltar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может в других БД это не так, но у меня возвращает 0. Наверное, потому, что используется Count и отсутствие записей - это не некая пустота, а вполне конкретное нулевое их количество. Если вы про это.
...
Рейтинг: 0 / 0
Left Join и условие по правой таблице
    #39735957
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BeltarМожет в других БД это не так, но у меня возвращает 0. Наверное, потому, что используется Count и отсутствие записей - это не некая пустота, а вполне конкретное нулевое их количество. Если вы про это.COUNT(*) и COUNT(<Expression>) работают по-разному и дают разный результат.
Expression IS NULL COUNT(<Expression>) игнорирует. А COUNT(*) считает всё.
...
Рейтинг: 0 / 0
Left Join и условие по правой таблице
    #39736030
Beltar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iap, я мог бы записать, например, так:

Код: sql
1.
Select Count(СменнаяВыработка.*) From СменнаяВыработка



Точнее, я так и хотел, но "Incorrect syntax near '*'".
...
Рейтинг: 0 / 0
Left Join и условие по правой таблице
    #39736031
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Beltariap, я мог бы записать, например, так:

Код: sql
1.
Select Count(СменнаяВыработка.*) From СменнаяВыработка



Точнее, я так и хотел, но "Incorrect syntax near '*'".
вы хелп принципиально не открываете?
...
Рейтинг: 0 / 0
Left Join и условие по правой таблице
    #39736055
Beltar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я иду что-то спрашивать только после того, как не нашел ни черта не в хелпе, ни в сети.
...
Рейтинг: 0 / 0
Left Join и условие по правой таблице
    #39736061
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BeltarЯ иду что-то спрашивать только после того, как не нашел ни черта не в хелпе, ни в сети.
и где написано, что писать Count(СменнаяВыработка.*) вообще допустимо?
...
Рейтинг: 0 / 0
Left Join и условие по правой таблице
    #39736137
Beltar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
 Select Count(СменнаяВыработка.*) From СменнаяВыработка



Что недопустимо.

И

Код: sql
1.
 Select Count(*) From СменнаяВыработка



Что допустимо.

Синтаксически эквивалентны. Должны быть.

Я не особо понимаю SQL, и использую его только для запросов из других программ, но, блин, ИмяТаблицы.ИмяПоля=ИмяПоля, если нет неопределенностей. Если они есть, то ИмяТаблицы становится обязательным.

Count(*) и Count(Id) тоже должны быть эквивалентны, если Id является первичным ключом, а значит не может быть NULL по определению.
...
Рейтинг: 0 / 0
Left Join и условие по правой таблице
    #39736152
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BeltarСинтаксически эквивалентны. Должны быть.Это вы сами придумали.
Вообще-то, можно считать, что COUNT(*) и COUNT(Expression) - разные функции.
Звёздочку по всей видимости здесь можно воспринимать как часть имени (подобно, например, слову "MAX" в VARCHAR(MAX)).
...
Рейтинг: 0 / 0
Left Join и условие по правой таблице
    #39736157
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BeltarCount(*) и Count(Id) тоже должны быть эквивалентны, если Id является первичным ключом, а значит не может быть NULL по определению.В таблице не может.
А в запросе ещё как может!
Пример вы сами привели своим запросом с LEFT JOIN
...
Рейтинг: 0 / 0
Left Join и условие по правой таблице
    #39736161
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iapBeltarCount(*) и Count(Id) тоже должны быть эквивалентны, если Id является первичным ключом, а значит не может быть NULL по определению.В таблице не может.
А в запросе ещё как может!
Пример вы сами привели своим запросом с LEFT JOINМожет быть, вы считаете, что COUNT(ПолеТаблицы) считает какие-то там поля таблицы?
Однако, COUNT() всегда считает количество строк !
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Left Join и условие по правой таблице
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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