Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Соединение таблиц по условию / 25 сообщений из 28, страница 1 из 2
02.05.2019, 21:42
    #39809354
trasca
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Соединение таблиц по условию
Есть таблица, в одном из столбцов которой могут встречаться Null-ы. Нужно соединить ее с другой таблицей, но только в том случае если в том столбце нет Null-ов.
...
Рейтинг: 0 / 0
02.05.2019, 21:58
    #39809359
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Соединение таблиц по условию
trasca,

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

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

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

Или непонятно, что вам нужно, тогда:
Гавриленко Сергей Алексеевичtrasca,
Будьте добры выполнить пункт 4 и пункт 6 .
...
Рейтинг: 0 / 0
03.05.2019, 16:32
    #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
03.05.2019, 16:59
    #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
03.05.2019, 17:22
    #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
03.05.2019, 17:36
    #39809538
buser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Соединение таблиц по условию
trasca, на всяк случай - мой запрос неверный... проверить можно пересечением
...
Рейтинг: 0 / 0
03.05.2019, 17:38
    #39809539
trasca
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Соединение таблиц по условию
buser,
Весь смысл как раз в том, чтобы обновить Таблицу @a только один раз, когда целиком заполнится Таблица @b, чтобы не блокировать ее каждым добавлением записи в Таблицу @b.
...
Рейтинг: 0 / 0
03.05.2019, 17:44
    #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
03.05.2019, 19:50
    #39809563
TheRookie
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Соединение таблиц по условию
Kopelly, оффтопик
Впервые за несколько лет чтения форумов sql.ru увидел EXCEPT.
Его реально у вас в продакшне можно найти?
...
Рейтинг: 0 / 0
03.05.2019, 22:44
    #39809593
Mind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Соединение таблиц по условию
TheRookie,

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

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

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

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

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

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

После этого желание у ТС что-то апдейтить, скорее всего, пройдет.
...
Рейтинг: 0 / 0
04.05.2019, 15:14
    #39809710
TheRookie
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Соединение таблиц по условию
aleks222TheRookieKopelly, оффтопик
Впервые за несколько лет чтения форумов sql.ru увидел EXCEPT.
Его реально у вас в продакшне можно найти?
А как ты сравниваешь наборы, которые могут содержать NULL?
Нешто пишешь (A = B or A is null and B is null)?
А это к чему, сравнение наборов, которые НАЛЛ могут содержать?
Вместо EXCEPT используем NOT EXISTS - потому что EXCEPT в себя DISTINCT включает, что не приемлемо обычно.
...
Рейтинг: 0 / 0
04.05.2019, 16:17
    #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
04.05.2019, 17:02
    #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
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Соединение таблиц по условию / 25 сообщений из 28, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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