powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Соединение таблиц по условию
28 сообщений из 28, показаны все 2 страниц
Соединение таблиц по условию
    #39809354
trasca
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть таблица, в одном из столбцов которой могут встречаться Null-ы. Нужно соединить ее с другой таблицей, но только в том случае если в том столбце нет Null-ов.
...
Рейтинг: 0 / 0
Соединение таблиц по условию
    #39809359
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
trasca,

left join
...
Рейтинг: 0 / 0
Соединение таблиц по условию
    #39809369
trasca
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvg,
Простой join, по-моему, не подойдет. Нужен join только в том случае, если в первой таблице нет пустых значений. Первая таблица это результат запроса. Примитивно: запрос, анализ результата, выход или join с этим же запросом, в зависимости от результата. Получается, что один запрос выполняется два раза.
...
Рейтинг: 0 / 0
Соединение таблиц по условию
    #39809374
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
trasca,

Будьте добры выполнить пункт 4 и пункт 6 .
...
Рейтинг: 0 / 0
Соединение таблиц по условию
    #39809449
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
trascaПростой join, по-моему, не подойдет.
Простой нет, а LEFT JOIN подойдёт :)

...
Рейтинг: 0 / 0
Соединение таблиц по условию
    #39809495
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
trascaalexeyvg,
Простой join, по-моему, не подойдет.Конечно, не подойдёт, нужен именно LEFT join

Или непонятно, что вам нужно, тогда:
Гавриленко Сергей Алексеевичtrasca,
Будьте добры выполнить пункт 4 и пункт 6 .
...
Рейтинг: 0 / 0
Соединение таблиц по условию
    #39809521
Kopelly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Начальную поставку можно интерпретировать как:

Код: sql
1.
2.
Select * From t1 
left join t2 on t1.id = t2.id and not exists (Select 1 From t1 Where Field is null)
...
Рейтинг: 0 / 0
Соединение таблиц по условию
    #39809530
trasca
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kopelly,
Да, но я начал из середины

Целиком задача выглядит так: есть Таблица @a, содержащая перечень товаров по участкам и Таблица @b, содержащая сборщиков собравших товары на своих участках. Необходимо в Таблице @a заполнить столбец Рicker в тот момент, когда будет целиком заполнена Таблица @b, т.е. Таблица @b будет содержать все участки, содержащиеся в столбце Department из Таблицы @a. Сервер MSSQL2008.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
declare @b table (Department varchar(10), Рicker varchar(10))
insert into @b values 
 ('Участок1', 'Иванов')
,('Участок2', 'Петров')

declare @a table (Product varchar(10), Department varchar(10), Рicker varchar(10))
insert into @a values
 ('Товар1', 'Участок1', Null)
,('Товар2', 'Участок1', Null)
,('Товар3', 'Участок2', Null)
,('Товар4', 'Участок2', Null)
,('Товар5', 'Участок3', Null)
,('Товар6', 'Участок3', Null)
...
Рейтинг: 0 / 0
Соединение таблиц по условию
    #39809535
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
trasca, а что изменится если обновится только та информация, что уже доступна?


Код: sql
1.
2.
3.
4.
update a
set Рicker = b.Рicker
from @a a inner join @b b on a.Department = b.Department
where (select count(Department) from @b) = (select count(distinct Department) from @a)



...
Рейтинг: 0 / 0
Соединение таблиц по условию
    #39809538
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
trasca, на всяк случай - мой запрос неверный... проверить можно пересечением
...
Рейтинг: 0 / 0
Соединение таблиц по условию
    #39809539
trasca
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
buser,
Весь смысл как раз в том, чтобы обновить Таблицу @a только один раз, когда целиком заполнится Таблица @b, чтобы не блокировать ее каждым добавлением записи в Таблицу @b.
...
Рейтинг: 0 / 0
Соединение таблиц по условию
    #39809540
Kopelly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
If not exists (Select Department  From @a
                   Except 
                   Select Department  From @b)
   update a 
    Set Рicker  = b.Рicker 
     From @a a
     join @b b on @a.Department = b.Department  
...
Рейтинг: 0 / 0
Соединение таблиц по условию
    #39809563
TheRookie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kopelly, оффтопик
Впервые за несколько лет чтения форумов sql.ru увидел EXCEPT.
Его реально у вас в продакшне можно найти?
...
Рейтинг: 0 / 0
Соединение таблиц по условию
    #39809593
Фотография Mind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TheRookie,

Впервые за несколько лет аж даже зарегился чтобы спросить про EXCEPT )))

Плохо читали, раз не видели.
...
Рейтинг: 0 / 0
Соединение таблиц по условию
    #39809598
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
trascaЦеликом задача выглядит так: есть Таблица @a, содержащая перечень товаров по участкам и Таблица @b, содержащая сборщиков собравших товары на своих участках. Необходимо в Таблице @a заполнить столбец Рicker в тот момент, когда будет целиком заполнена Таблица @b, т.е. Таблица @b будет содержать все участки, содержащиеся в столбце Department из Таблицы @a. Сервер MSSQL2008.Понятнее не стало :-)
"заполнить столбец Рicker" - имеется в виду обновить значение с null на какое то другое?
Обновление делается командой update
То есть, что бы решить задачу из вашего описания, вам сначала нужно "целиком заполняете" таблицу @b, а потом выполнить команду update, что бы поменять значение столбца Рicker.
...
Рейтинг: 0 / 0
Соединение таблиц по условию
    #39809610
PizzaPizza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
trasca,

Совершенно непонятно, что у вас в задаче есть сущность, например. Что у вас ключ соединения.

Если вы соединяете по Участку, и @b является справочником участков, то раскройте физический смысл таблицы @а. Что за сущность вы там храните?

Как база поймет когда "целиком заполнена Таблица @b" и что такое "все участки".
...
Рейтинг: 0 / 0
Соединение таблиц по условию
    #39809611
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TheRookieKopelly, оффтопик
Впервые за несколько лет чтения форумов sql.ru увидел EXCEPT.
Его реально у вас в продакшне можно найти?
А как ты сравниваешь наборы, которые могут содержать NULL?
Нешто пишешь (A = B or A is null and B is null)?
...
Рейтинг: 0 / 0
Соединение таблиц по условию
    #39809619
trasca
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PizzaPizza, alexeyvg,
Таблица @a - это фрагмент таблицы заявок на сборку товаров по участкам, полная Таблица @a содержит идентификатор заявки; количество и другие столбцы. Таблица @b - это фрагмент таблицы выполненных заданий на сборку по участкам; полная Таблица @b содержит еще и идентификатор заявки. На каждом участке работает несколько сборщиков. В системе отслеживается два события: появление новой заявки (новых строк в Таблице @a) и выполнение задания на сборку (добавление строк в Таблицу @b). При появлении новой заявки сборщикам выдаются задания на сборку - лист бумаги с перечнем товаров, хранящемся на определенном участке и количеством, которые должен собрать конкретный сборщик. Задание на сборку имеет штрихкод, содержащий идентификатор заявки, идентификатор участка, идентификатор сборщика. После выполнения задания на сборку сборщик сканирует штрихкод заявки, Таблица @b дополняется записью. После того, как все задания на сборку по конкретной заявке исполнены (отсканировано последнее задание на сборку) апдейтится столбец Рicker в Таблице @a и удаляются строки по исполненной заявке из Таблицы @b.
...
Рейтинг: 0 / 0
Соединение таблиц по условию
    #39809635
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
trascaПосле выполнения задания на сборку сборщик сканирует штрихкод заявки, Таблица @b дополняется записью. После того, как все задания на сборку по конкретной заявке исполнены (отсканировано последнее задание на сборку) апдейтится столбец Рicker в Таблице @a и удаляются строки по исполненной заявке из Таблицы @b.Из этого непонятно, что нужно сделать со стороны SQL Server
"все задания ... исполнены" - это административное, бизнес - событие
Сервер не может знать, все задания выполнены, или не все.
По крайней мере, вы про это ничего не сказали.

Соответственно, когда это событие наступает, какой то менеджер (мастер, учётчик) нажимает кнопку, и на сервере нужно выполнить команду UPDATE
...
Рейтинг: 0 / 0
Соединение таблиц по условию
    #39809644
trasca
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvg,
Сборщик сканирует штрихкод задания, Таблица @b дополняется записью. В этот момент должен запускаться запрос на обновление Таблицы @a, но обновление должно произойти только в том случае, если Таблица @b содержит записи по всем участкам, которые есть в Таблице @a по конкретной заявке.
...
Рейтинг: 0 / 0
Соединение таблиц по условию
    #39809668
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поле "Заявка" в твоем примере отсутствует.
Попробуй отойти от полей и таблиц и сформулируй задачу на уровне и в терминах кладовщика/товароведа/технолога.
...
Рейтинг: 0 / 0
Соединение таблиц по условию
    #39809689
Wlr-l
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
982183Поле "Заявка" в твоем примере отсутствует.
Попробуй отойти от полей и таблиц и сформулируй задачу на уровне и в терминах кладовщика/товароведа/технолога.

После этого желание у ТС что-то апдейтить, скорее всего, пройдет.
...
Рейтинг: 0 / 0
Соединение таблиц по условию
    #39809710
TheRookie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222TheRookieKopelly, оффтопик
Впервые за несколько лет чтения форумов sql.ru увидел EXCEPT.
Его реально у вас в продакшне можно найти?
А как ты сравниваешь наборы, которые могут содержать NULL?
Нешто пишешь (A = B or A is null and B is null)?
А это к чему, сравнение наборов, которые НАЛЛ могут содержать?
Вместо EXCEPT используем NOT EXISTS - потому что EXCEPT в себя DISTINCT включает, что не приемлемо обычно.
...
Рейтинг: 0 / 0
Соединение таблиц по условию
    #39809726
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TheRookieА это к чему, сравнение наборов, которые НАЛЛ могут содержать?
Вместо EXCEPT используем NOT EXISTS - потому что EXCEPT в себя DISTINCT включает, что не приемлемо обычно.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
declare @t1 table (id int, a int null, b int null);
declare @t2 table (id int primary key, a int null, b int null);
declare @t3 table (id int, a int null, b int null, unique (a, b));
declare @t4 table (id int, a int null, b int null);

insert into @t3 values (1, null, null);
insert into @t4 values (1, null, null);

set statistics xml on;

/*1*/select id, a, b from @t1 except select id, a, b from @t4;
/*2*/select id, a, b from @t2 except select id, a, b from @t4;
/*3*/select id, a, b from @t3 except select id, a, b from @t4;

set statistics xml off;


1. Покажите distinct в запросах 2 и 3.
2. Для запроса 3 покажите решение через exists.
...
Рейтинг: 0 / 0
Соединение таблиц по условию
    #39809731
TheRookie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm1. Покажите distinct в запросах 2 и 3.

Это тест на внимательность какой-то?)))
Но ок, вот к запросу 2

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
declare @t2 table (id int /*primary key*/, a int null, b int null);
declare @t4 table (id int, a int null, b int null);

insert into @t4 values (1, null, null);
insert into @t2 values (1, null, null);
insert into @t2 values (1, null, null);
insert into @t2 values (1, 2,3 );
insert into @t2 values (1, 2,3 );

/*2*/select id, a, b from @t2 except select id, a, b from @t4;
--1	2	3



В чём прикол, комрад?
...
Рейтинг: 0 / 0
Соединение таблиц по условию
    #39809733
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TheRookieЭто тест на внимательность какой-то?)))Это тест на понимание. И вы его провалили.
...
Рейтинг: 0 / 0
Соединение таблиц по условию
    #39809798
PizzaPizza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
trascaalexeyvg,
Сборщик сканирует штрихкод задания, Таблица @b дополняется записью. В этот момент должен запускаться запрос на обновление Таблицы @a, но обновление должно произойти только в том случае, если Таблица @b содержит записи по всем участкам, которые есть в Таблице @a по конкретной заявке.

В общем выполняется вставка в @b, проверка @а по условию из @b, a затем апдейт. Ну и пишите например процедуру на это или в приложении реализуйте последовательность. Чо городить то.
...
Рейтинг: 0 / 0
Соединение таблиц по условию
    #39810235
Фотография StarikNavy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TheRookie
Впервые за несколько лет чтения форумов sql.ru увидел EXCEPT.

http://prntscr.com/nl1iyn

плохо читаете
...
Рейтинг: 0 / 0
28 сообщений из 28, показаны все 2 страниц
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Соединение таблиц по условию
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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