Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2      [все]
 Соединение таблиц по условию  [new]
trasca
Member

Откуда:
Сообщений: 8
Есть таблица, в одном из столбцов которой могут встречаться Null-ы. Нужно соединить ее с другой таблицей, но только в том случае если в том столбце нет Null-ов.
2 май 19, 21:42    [21877100]     Ответить | Цитировать Сообщить модератору
 Re: Соединение таблиц по условию  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 28867
trasca,

left join
2 май 19, 21:58    [21877107]     Ответить | Цитировать Сообщить модератору
 Re: Соединение таблиц по условию  [new]
trasca
Member

Откуда:
Сообщений: 8
alexeyvg,
Простой join, по-моему, не подойдет. Нужен join только в том случае, если в первой таблице нет пустых значений. Первая таблица это результат запроса. Примитивно: запрос, анализ результата, выход или join с этим же запросом, в зависимости от результата. Получается, что один запрос выполняется два раза.
2 май 19, 23:11    [21877135]     Ответить | Цитировать Сообщить модератору
 Re: Соединение таблиц по условию  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36317
trasca,

Будьте добры выполнить пункт 4 и пункт 6.
2 май 19, 23:35    [21877140]     Ответить | Цитировать Сообщить модератору
 Re: Соединение таблиц по условию  [new]
Дмитрий Мух
Member

Откуда: Зеленоград
Сообщений: 1893
trasca
Простой join, по-моему, не подойдет.

Простой нет, а LEFT JOIN подойдёт :)

Картинка с другого сайта.
3 май 19, 11:50    [21877273]     Ответить | Цитировать Сообщить модератору
 Re: Соединение таблиц по условию  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 28867
trasca
alexeyvg,
Простой join, по-моему, не подойдет.
Конечно, не подойдёт, нужен именно LEFT join

Или непонятно, что вам нужно, тогда:
Гавриленко Сергей Алексеевич
trasca,
Будьте добры выполнить пункт 4 и пункт 6.
3 май 19, 14:28    [21877340]     Ответить | Цитировать Сообщить модератору
 Re: Соединение таблиц по условию  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 283
Начальную поставку можно интерпретировать как:

Select * From t1 
left join t2 on t1.id = t2.id and not exists (Select 1 From t1 Where Field is null)
3 май 19, 16:32    [21877393]     Ответить | Цитировать Сообщить модератору
 Re: Соединение таблиц по условию  [new]
trasca
Member

Откуда:
Сообщений: 8
Kopelly,
Да, но я начал из середины

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

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)
3 май 19, 16:59    [21877405]     Ответить | Цитировать Сообщить модератору
 Re: Соединение таблиц по условию  [new]
buser
Member

Откуда: Санкт-Петербург
Сообщений: 4439
trasca, а что изменится если обновится только та информация, что уже доступна?
+


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)


3 май 19, 17:22    [21877417]     Ответить | Цитировать Сообщить модератору
 Re: Соединение таблиц по условию  [new]
buser
Member

Откуда: Санкт-Петербург
Сообщений: 4439
trasca, на всяк случай - мой запрос неверный... проверить можно пересечением
3 май 19, 17:36    [21877425]     Ответить | Цитировать Сообщить модератору
 Re: Соединение таблиц по условию  [new]
trasca
Member

Откуда:
Сообщений: 8
buser,
Весь смысл как раз в том, чтобы обновить Таблицу @a только один раз, когда целиком заполнится Таблица @b, чтобы не блокировать ее каждым добавлением записи в Таблицу @b.
3 май 19, 17:38    [21877426]     Ответить | Цитировать Сообщить модератору
 Re: Соединение таблиц по условию  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 283
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  
3 май 19, 17:44    [21877429]     Ответить | Цитировать Сообщить модератору
 Re: Соединение таблиц по условию  [new]
TheRookie
Member

Откуда:
Сообщений: 10
Kopelly, оффтопик
Впервые за несколько лет чтения форумов sql.ru увидел EXCEPT.
Его реально у вас в продакшне можно найти?
3 май 19, 19:50    [21877483]     Ответить | Цитировать Сообщить модератору
 Re: Соединение таблиц по условию  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2277
TheRookie,

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

Плохо читали, раз не видели.
3 май 19, 22:44    [21877549]     Ответить | Цитировать Сообщить модератору
 Re: Соединение таблиц по условию  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 28867
trasca
Целиком задача выглядит так: есть Таблица @a, содержащая перечень товаров по участкам и Таблица @b, содержащая сборщиков собравших товары на своих участках. Необходимо в Таблице @a заполнить столбец Рicker в тот момент, когда будет целиком заполнена Таблица @b, т.е. Таблица @b будет содержать все участки, содержащиеся в столбце Department из Таблицы @a. Сервер MSSQL2008.
Понятнее не стало :-)
"заполнить столбец Рicker" - имеется в виду обновить значение с null на какое то другое?
Обновление делается командой update
То есть, что бы решить задачу из вашего описания, вам сначала нужно "целиком заполняете" таблицу @b, а потом выполнить команду update, что бы поменять значение столбца Рicker.
3 май 19, 23:14    [21877561]     Ответить | Цитировать Сообщить модератору
 Re: Соединение таблиц по условию  [new]
PizzaPizza
Member

Откуда:
Сообщений: 271
trasca,

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

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

Как база поймет когда "целиком заполнена Таблица @b" и что такое "все участки".
4 май 19, 05:40    [21877601]     Ответить | Цитировать Сообщить модератору
 Re: Соединение таблиц по условию  [new]
aleks222
Member

Откуда:
Сообщений: 708
TheRookie
Kopelly, оффтопик
Впервые за несколько лет чтения форумов sql.ru увидел EXCEPT.
Его реально у вас в продакшне можно найти?

А как ты сравниваешь наборы, которые могут содержать NULL?
Нешто пишешь (A = B or A is null and B is null)?
4 май 19, 05:41    [21877602]     Ответить | Цитировать Сообщить модератору
 Re: Соединение таблиц по условию  [new]
trasca
Member

Откуда:
Сообщений: 8
PizzaPizza, alexeyvg,
Таблица @a - это фрагмент таблицы заявок на сборку товаров по участкам, полная Таблица @a содержит идентификатор заявки; количество и другие столбцы. Таблица @b - это фрагмент таблицы выполненных заданий на сборку по участкам; полная Таблица @b содержит еще и идентификатор заявки. На каждом участке работает несколько сборщиков. В системе отслеживается два события: появление новой заявки (новых строк в Таблице @a) и выполнение задания на сборку (добавление строк в Таблицу @b). При появлении новой заявки сборщикам выдаются задания на сборку - лист бумаги с перечнем товаров, хранящемся на определенном участке и количеством, которые должен собрать конкретный сборщик. Задание на сборку имеет штрихкод, содержащий идентификатор заявки, идентификатор участка, идентификатор сборщика. После выполнения задания на сборку сборщик сканирует штрихкод заявки, Таблица @b дополняется записью. После того, как все задания на сборку по конкретной заявке исполнены (отсканировано последнее задание на сборку) апдейтится столбец Рicker в Таблице @a и удаляются строки по исполненной заявке из Таблицы @b.
4 май 19, 07:52    [21877614]     Ответить | Цитировать Сообщить модератору
 Re: Соединение таблиц по условию  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 28867
trasca
После выполнения задания на сборку сборщик сканирует штрихкод заявки, Таблица @b дополняется записью. После того, как все задания на сборку по конкретной заявке исполнены (отсканировано последнее задание на сборку) апдейтится столбец Рicker в Таблице @a и удаляются строки по исполненной заявке из Таблицы @b.
Из этого непонятно, что нужно сделать со стороны SQL Server
"все задания ... исполнены" - это административное, бизнес - событие
Сервер не может знать, все задания выполнены, или не все.
По крайней мере, вы про это ничего не сказали.

Соответственно, когда это событие наступает, какой то менеджер (мастер, учётчик) нажимает кнопку, и на сервере нужно выполнить команду UPDATE
4 май 19, 09:09    [21877637]     Ответить | Цитировать Сообщить модератору
 Re: Соединение таблиц по условию  [new]
trasca
Member

Откуда:
Сообщений: 8
alexeyvg,
Сборщик сканирует штрихкод задания, Таблица @b дополняется записью. В этот момент должен запускаться запрос на обновление Таблицы @a, но обновление должно произойти только в том случае, если Таблица @b содержит записи по всем участкам, которые есть в Таблице @a по конкретной заявке.
4 май 19, 09:50    [21877648]     Ответить | Цитировать Сообщить модератору
 Re: Соединение таблиц по условию  [new]
982183
Member

Откуда: VL
Сообщений: 3028
Поле "Заявка" в твоем примере отсутствует.
Попробуй отойти от полей и таблиц и сформулируй задачу на уровне и в терминах кладовщика/товароведа/технолога.
4 май 19, 11:47    [21877680]     Ответить | Цитировать Сообщить модератору
 Re: Соединение таблиц по условию  [new]
Wlr-l
Member

Откуда:
Сообщений: 498
982183
Поле "Заявка" в твоем примере отсутствует.
Попробуй отойти от полей и таблиц и сформулируй задачу на уровне и в терминах кладовщика/товароведа/технолога.


После этого желание у ТС что-то апдейтить, скорее всего, пройдет.
4 май 19, 12:57    [21877704]     Ответить | Цитировать Сообщить модератору
 Re: Соединение таблиц по условию  [new]
TheRookie
Member

Откуда:
Сообщений: 10
aleks222
TheRookie
Kopelly, оффтопик
Впервые за несколько лет чтения форумов sql.ru увидел EXCEPT.
Его реально у вас в продакшне можно найти?

А как ты сравниваешь наборы, которые могут содержать NULL?
Нешто пишешь (A = B or A is null and B is null)?

А это к чему, сравнение наборов, которые НАЛЛ могут содержать?
Вместо EXCEPT используем NOT EXISTS - потому что EXCEPT в себя DISTINCT включает, что не приемлемо обычно.
4 май 19, 15:14    [21877741]     Ответить | Цитировать Сообщить модератору
 Re: Соединение таблиц по условию  [new]
invm
Member

Откуда: Москва
Сообщений: 8712
TheRookie
А это к чему, сравнение наборов, которые НАЛЛ могут содержать?
Вместо EXCEPT используем NOT EXISTS - потому что EXCEPT в себя DISTINCT включает, что не приемлемо обычно.
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.
4 май 19, 16:17    [21877766]     Ответить | Цитировать Сообщить модератору
 Re: Соединение таблиц по условию  [new]
TheRookie
Member

Откуда:
Сообщений: 10
invm
1. Покажите distinct в запросах 2 и 3.

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

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


В чём прикол, комрад?

К сообщению приложен файл. Размер - 38Kb
4 май 19, 17:02    [21877780]     Ответить | Цитировать Сообщить модератору
 Re: Соединение таблиц по условию  [new]
invm
Member

Откуда: Москва
Сообщений: 8712
TheRookie
Это тест на внимательность какой-то?)))
Это тест на понимание. И вы его провалили.
4 май 19, 17:06    [21877783]     Ответить | Цитировать Сообщить модератору
 Re: Соединение таблиц по условию  [new]
PizzaPizza
Member

Откуда:
Сообщений: 271
trasca
alexeyvg,
Сборщик сканирует штрихкод задания, Таблица @b дополняется записью. В этот момент должен запускаться запрос на обновление Таблицы @a, но обновление должно произойти только в том случае, если Таблица @b содержит записи по всем участкам, которые есть в Таблице @a по конкретной заявке.


В общем выполняется вставка в @b, проверка @а по условию из @b, a затем апдейт. Ну и пишите например процедуру на это или в приложении реализуйте последовательность. Чо городить то.
4 май 19, 22:25    [21877884]     Ответить | Цитировать Сообщить модератору
 Re: Соединение таблиц по условию  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2192
TheRookie

Впервые за несколько лет чтения форумов sql.ru увидел EXCEPT.

http://prntscr.com/nl1iyn

плохо читаете
6 май 19, 14:38    [21878994]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / Microsoft SQL Server Ответить