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

Откуда:
Сообщений: 12
Доброго времени суток

Решил попробовать решить задачу, для упрощения работы пользователей.
Есть 2 SQL базы. Которые должны быть идентичные, но они не сихронизируются по разным причинам.
Есть 2 таблицы, по 1 в каждой базе, они должны быть идентичные, но как раз и стоит задача отследить расхождения.
Я хочу попытаться с помощью запроса сделать перенос данных из этих таблиц в новую таблицу, с выводом результатов расхождения.
Сейчас тестирую и наткнулся на сложность:
1. Я перед выполнением очищаю таблицу.
Далее переношу данные по условию, скажем так, наименования в базе должны быть идентичны и по их критерию могу попытаться выстроить таблицу.

DELETE FROM [skd1].dbo.[1]
INSERT INTO [skd1].dbo.[1] ([1],[2],[3],[4],[5],[6])
select [skd].dbo.[1].[1], [skd].dbo.[1].[2], [skd].dbo.[1].[3], test.dbo.[2].[4], test.dbo.[2].[5], test.dbo.[2].[6] from skd.dbo.[1], test.dbo.[2]
WHERE [skd].dbo.[1].[1]=test.dbo.[2].[4];

А вот как бы мне теперь сделать INSERT INTO [skd1].dbo.[1] ([7]) и занести туда значение:
Если [skd].dbo.[1].[2] != test.dbo.[2].[5] то записать в ячейку слово "Расхождение"
Если условие не верно, то ничего не записывать и как то проверку на 0 ещё не упустить бы.
Я честно полный 0 в SQL но в общем то интересно, и пытаюсь учиться.
Буду раз любой помощи.
22 сен 14, 17:50    [16606340]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в SQL запросе  [new]
alex564657498765453
Member

Откуда:
Сообщений: 1925
rough-84,

.dbo

вроде MS SQL server!

Модератор: Тема перенесена из форума "MySQL".


Сообщение было отредактировано: 22 сен 14, 18:17
22 сен 14, 18:02    [16606406]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в SQL запросе  [new]
Glory
Member

Откуда:
Сообщений: 104751
Если вы сначала удаляете все из [skd1].dbo.[1], то что вы собрались сравнивать то ??
22 сен 14, 21:48    [16607150]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в SQL запросе  [new]
o-o
Guest
Glory
Если вы сначала удаляете все из [skd1].dbo.[1], то что вы собрались сравнивать то ??

да не, он соединяет 2 таблицы (skd.dbo.[1], test.dbo.[2]) по условию [skd].dbo.[1].[1]=test.dbo.[2].[4]
и результат записывает в таблицу [skd1].dbo.[1], к-ую предварительно очищает
(от результата предыдущего аналогичного действа. почему не truncate и не drop? -- чтоб дольше работало, наверное)
а хочет вот такое:
declare @skd1 table(id int, val1 int, val2 int, res varchar(9)); 

declare @t1 table (id int identity, val int);
insert into @t1(val) values (1), (2);

declare @t2 table (id int identity, val int);
insert into @t2(val) values (1), (3);

insert into @skd1(id, val1, val2, res)
select t1.id, t1.val, t2.val,
       case when t1.val <> t2.val then 'different' end
from @t1 t1 join @t2 t2 on t1.id = t2.id;

select *
from @skd1;
------------------------------------
id	val1	val2	res
1	1	1	NULL
2	2	3	different

ну или так можно:
declare @skd1 table(id int, val1 int, val2 int, res as case when val1 <> val2 then 'different' end); 

declare @t1 table (id int identity, val int);
insert into @t1(val) values (1), (2);

declare @t2 table (id int identity, val int);
insert into @t2(val) values (1), (3);

insert into @skd1(id, val1, val2)
select t1.id, t1.val, t2.val
from @t1 t1 join @t2 t2 on t1.id = t2.id;

select *
from @skd1;
------------------------------------
id	val1	val2	res
1	1	1	NULL
2	2	3	different

а вот это: "как то проверку на 0 ещё не упустить бы" -- наверное про NULL в обеих сравниваемых колонках.
только что надо-то, чтобы давало DIFFERENT или чтоб за одинаковое считалось?
22 сен 14, 22:49    [16607376]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в SQL запросе  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
rough-84
Я честно полный 0 в SQL но в общем то интересно, и пытаюсь учиться.

Научитесь сначла объяснять, что вам нужно. Я лично ничего не понял. Какой то набор цифр и непонятных условий. Что с чем сравнивается? Зачем? Какие базы, какие таблицы?
22 сен 14, 22:53    [16607396]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в SQL запросе  [new]
o-o
Guest
Mind,

то когда лень, она повсюду: дать таблицам и столбцам осмысленные имена?
да еще их потом НАБИРАТь?

и что за полупустой стакан? надо и плюсы видеть:
никто и никогда не догадается, что скрывается за цифрами -- конспирация.
самому помнить, что с чем и как соединятся -- тренировка памяти.
23 сен 14, 00:21    [16607642]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в SQL запросе  [new]
rough-84
Member

Откуда:
Сообщений: 12
Доброго времени суток.
Прошу прощения за плохо сформулированную задачу.
Напишу всё по порядку.
Есть 2 базы:
1с база и база программы WMS (это программа для склада, размещение, выдачи материалов). Обе базы в sql. В каждой из этих баз есть основная таблица материалов. Для примера возьмём базу "main" со столбцами (id, kollichestvo, status ) и базу "wms" со столбцами (id, kollichestvo, status ) . Есть и другие столбцы, но нас интересуют только эти.
Задача:
Вывести в новую таблицу данные в виде "new_table" со столбцами (main.id, main.kollichestvo, main.status, wms.id, wms.kollichestvo, wms.status и result ), где result должен сравнивать ячейку kollichestvo в базах main и wms и если значения не равны, писать что то типа "Расхождение" а если равны, ничего не писать в эту ячейку.
Условием для выборки я выбрал main.id=wms.id, т.к все названия уникальны и 2 одинаковых имени встретиться не могут, а вот порядок этих id в таблицах может быть разным.

Все совету просмотрю, спасибо.
23 сен 14, 09:31    [16608153]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в SQL запросе  [new]
Glory
Member

Откуда:
Сообщений: 104751
rough-84
Напишу всё по порядку.

https://www.sql.ru/forum/127456/rekomendacii-po-oformleniu-soobshheniy-v-forume п.4 и п.6
23 сен 14, 10:32    [16608486]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в SQL запросе  [new]
rough-84
Member

Откуда:
Сообщений: 12
Спасибо.
Воспользовался вашим примером, получил нужный результат. Буду дальше тестировать уже на бэкапах основных баз.
Как я уже сказал скулём не владею совсем, подскажите, не будет ли каких либо осложнений с таким запросом, я хочу закинуть его в регламентные задания и скажем хотя бы раз в сутки отрабатывать.

declare @skd1 table(id int, val1 int, val2 int, res as case when val1 <> val2 then 'different' end);

insert into @skd1(id, val1, val2)
select [skd].dbo.table1.id1, [skd].dbo.table1.val1, test.dbo.table2.val2 from skd.dbo.table1 join test.dbo.table2
on [skd].dbo.table1.id1=test.dbo.table2.id2
DELETE FROM [skd1].dbo.result
insert into skd1.dbo.result ([id],[val1],[val2],[result])
select * from @skd1;
23 сен 14, 10:42    [16608561]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в SQL запросе  [new]
rough-84
Member

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

Спасибо, приму к сведению, я тут в первый раз.
23 сен 14, 10:45    [16608583]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в SQL запросе  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
rough-84
Glory,

Спасибо, приму к сведению, я тут в первый раз.
И тегом SRC пользуйтесь
23 сен 14, 10:46    [16608596]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в SQL запросе  [new]
rough-84
Member

Откуда:
Сообщений: 12
o-o,

Подскажи, а как в этой строчке
declare @skd1 table(id int, val1 int, val2 int, res as case when val1 <> val2 then 'different' end);
записать в ячейку res значение, которое будет равно val2 минус val1.
Спасибо.
23 сен 14, 12:09    [16609190]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в SQL запросе  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31990
rough-84
Подскажи, а как в этой строчке
declare @skd1 table(id int, val1 int, val2 int, res as case when val1 <> val2 then 'different' end); 

записать в ячейку res значение, которое будет равно val2 минус val1.
Ячейка res - это у вас вычисляемое поле, которое имеет тип "строка" и может принимать 2 значения: 'different' или NULL

Если вы хотите, что бы оно принимало значения val2 минус val1, то так и надо написать: val2 - val1.
23 сен 14, 12:45    [16609580]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в SQL запросе  [new]
o-o
Guest
rough-84,

у меня там табличная переменная @skd1 использованa затем, чтобы таблицу не создавать и не дропать потом.
для обычных таблиц все то же самое, т.е. можете смело заменить на постоянную таблицу,
а то @skd1 исчезнет вместе с объявившим ее батчем.
ну т.е. если думаете в дальнейшем еще как-то использовать заполненную таблицу,
то надо ее сделать постоянной, обычный create table skd1 (...)
23 сен 14, 13:24    [16610004]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в SQL запросе  [new]
rough-84
Member

Откуда:
Сообщений: 12
o-o,

rough-84,

у меня там табличная переменная @skd1 использованa затем, чтобы таблицу не создавать и не дропать потом.
для обычных таблиц все то же самое, т.е. можете смело заменить на постоянную таблицу,
а то @skd1 исчезнет вместе с объявившим ее батчем.
ну т.е. если думаете в дальнейшем еще как-то использовать заполненную таблицу,
то надо ее сделать постоянной, обычный create table skd1 (...)

-------------------------------
Я понимаю что это бред, проще лить сразу в созданную таблицу, но дело в том что, я не знаю как мне в эту постоянную таблицу внести значение результата, который в вашем примере получается из :
declare @skd1 table(id int, val1 int, val2 int, res as case when val1 <> val2 then 'different' end);

Натолкните на правильный ход мыслей
таблица1 skd(id1, val1) таблица 2 test(id2,val2) таблица 3 result(id1,val1,val2,res). Где столбец res это либо разница в val2-val1 либо строка 'different' при условии что val1 <> val2.

1. я в созданную таблицу заношу результаты из 2 имеющихся таблиц по условию.

insert into result(id, val1, val2)
select skd.id1, sk].val1, test.val2 from skd join test
on skd.id1=test.id2
и вот тут я не знаю как мне заполнить ячейку res из таблицы Result по нужным условиям.
23 сен 14, 15:28    [16610943]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в SQL запросе  [new]
rough-84
Member

Откуда:
Сообщений: 12
o-o,

Только что понял что я глупец и сам себя заморочил.
Я ведь могу изначально создать таблицу в которой нужный мне столбец "res" будет давать нужные данные. То есть как вы и сказали просто создать таблицу используя оператор create table.
Простите, за мою тупость, пойду тестировать.
23 сен 14, 15:43    [16611062]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в SQL запросе  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31990
rough-84
insert into result(id, val1, val2)
select skd.id1, sk].val1, test.val2 from skd join test
on skd.id1=test.id2
и вот тут я не знаю как мне заполнить ячейку res из таблицы Result по нужным условиям.

insert into result(id, val1, val2, res)
select	skd.id1, skd.val1, test.val2, sk.val1 + test.val2
from skd 
	join test on skd.id1=test.id2
23 сен 14, 16:08    [16611215]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в SQL запросе  [new]
rough-84
Member

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

Спасибо. Есть принципиальная разница, использовать sk.val1 + test.val2 в запросе или явно указать в таблице при создании ?

Конечный вариант сделал таким. А ячейку столбец res считает сам.

DELETE FROM [skd1].dbo.result
insert into skd1.dbo.result(id, val1, val2)
select [skd].dbo.table1.id1, [skd].dbo.table1.val1, test.dbo.table2.val2 from skd.dbo.table1 join test.dbo.table2
on [skd].dbo.table1.id1=test.dbo.table2.id2


Картинка с другого сайта.

Вроде работает, всем спасибо за советы балбесу.
23 сен 14, 16:33    [16611376]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в SQL запросе  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31990
rough-84
Есть принципиальная разница, использовать sk.val1 + test.val2 в запросе или явно указать в таблице при создании ?

Конечный вариант сделал таким.
При расчёте в запросе вы сохраняете данные в таблицу, они потом не поменяются без вашего желания, его значение будет вычислятся в момент сохранения в табицу.

А при определении вычисляемого поля в таблице его значение будет расчитываться при выборке данных, и будет всегда сответствовать полям, из которых оно вычисляется.

Выбор из этих вариантов зависит от ваших требований.
23 сен 14, 16:48    [16611479]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в SQL запросе  [new]
o-o
Guest
alexeyvg
rough-84
Есть принципиальная разница, использовать sk.val1 + test.val2 в запросе или явно указать в таблице при создании ?

Конечный вариант сделал таким.
При расчёте в запросе вы сохраняете данные в таблицу, они потом не поменяются без вашего желания, его значение будет вычислятся в момент сохранения в табицу.

А при определении вычисляемого поля в таблице его значение будет расчитываться при выборке данных, и будет всегда сответствовать полям, из которых оно вычисляется.

Выбор из этих вариантов зависит от ваших требований.


для полноты картины процитирую про PERSISTED Computed Columns ,
это как раз когда я не хочу, чтобы каждый раз рассчитывалось при выборке,
или мне это не подходит из индексных соображений:

Unless otherwise specified, computed columns are virtual columns that are not physically stored in the table. Their values are recalculated every time they are referenced in a query. The Database Engine uses the PERSISTED keyword in the CREATE TABLE and ALTER TABLE statements to physically store computed columns in the table. Their values are updated when any columns that are part of their calculation change. By marking a computed column as PERSISTED, you can create an index on a computed column that is deterministic but not precise. Additionally, if a computed column references a CLR function, the Database Engine cannot verify whether the function is truly deterministic. In this case, the computed column must be PERSISTED so that indexes can be created on it.
23 сен 14, 17:09    [16611656]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в SQL запросе  [new]
rough-84
Member

Откуда:
Сообщений: 12
Доброго времени суток.
Помогите пожалуйста ещё разок.
Первый запрос с 2 таблицами

Картинка с другого сайта.

Получаю 9361 полей из которых 456 с пустым полем location_id
Второй запрос с 3 таблицами

Картинка с другого сайта.

Получаю 8905 полей.
Получается в моём сравнении не учитываются поля в которых location_id пустое поле.
Создать пустое в таблице location я не могу.
Собственно вопрос, как бы мне всё таки выводить поля с пустыми значениями location_id.

Заранее извиняюсь если вопрос прост и лежит на поверхности, но что то пока не соображу никак.
1 окт 14, 17:02    [16645910]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в SQL запросе  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8839
Используйте правое объединение с таблицей объектов.
1 окт 14, 17:44    [16646224]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в SQL запросе  [new]
Glory
Member

Откуда:
Сообщений: 104751
rough-84
Собственно вопрос, как бы мне всё таки выводить поля с пустыми значениями location_id.

Узнать, что кроме INNER JOIN существуют еще и другие JOIN-ы. Например, LEFT OUTER
1 окт 14, 17:45    [16646237]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в SQL запросе  [new]
rough-84
Member

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

Спасибо.
1 окт 14, 17:50    [16646267]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в SQL запросе  [new]
rough-84
Member

Откуда:
Сообщений: 12
Доброго времени суток ещё раз.
Столкнулся с очередной проблемой.
В настоящий момент пытаюсь запросом заливать данные в таблицу 1с.
1. Создал таблицу в 1с для начала всего 3 поля (код, ячейка, количество) и вычислил её имя в sql 2008.
В sql я вижу что в параметрах столбца стоит - запрещено запись значения NULL, поменять само собой не могу, а 1с программист говорит что создать таблицу в которой будет этот параметр разрешен нельзя (не в курсе прав он или просто сказал так чтобы я не приставал).
При попытке записать данные у меня само собой ругается, что нельзя записать в ячейки поля NULL.
Собственно вопрос, натолкните на мысль, что почитать в плане того чтобы сделать Insert и записать ячейки с NULL как ячейки скажем со значением "0".

Запрос который я выполняю:

delete from _test
insert into _test (_kod,_location,_Quantity)
SELECT wms.dbo.Materials.NameEN, wms.dbo.Locations.LocationName, wms.dbo.WarehouseSummary.BaseQuantity
FROM wms.dbo.WarehouseSummary INNER JOIN
wms.dbo.StorageObjects ON wms.dbo.WarehouseSummary.StorageObject_id = wms.dbo.StorageObjects.tid INNER JOIN
wms.dbo.Materials ON wms.dbo.WarehouseSummary.Material_id = wms.dbo.Materials.tid LEFT OUTER JOIN
wms.dbo.Locations ON wms.dbo.StorageObjects.Location_id = wms.dbo.Locations.tid
WHERE (wms.dbo.WarehouseSummary.BaseQuantity <> 0)

Спасибо.
9 окт 14, 16:35    [16682949]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить