Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как статические данные в условии where превратить в динамические / 18 сообщений из 18, страница 1 из 1
24.10.2002, 17:30:27
    #32061671
antonz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как статические данные в условии where превратить в динамические
Подзапрос в условии возвращает статические данные на начало запроса, а что делать, если запрос влияет на подзапрос
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[at1]') and OBJECTPROPERTY(id, N'IsUserTable') =  1 )
drop table dbo.at1
GO
CREATE TABLE at1 (
	f1 int ,
	f2 char( 10 ) )
GO
insert into at1 values( 1 ,'a')
insert into at1 values( 2 ,'b')
insert into at1 values( 3 ,'c')
insert into at1 values( 4 ,'d')
insert into at1 values( 2 ,'b')
insert into at1 values( 3 ,'c')
insert into at1 values( 5 ,'f')

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[at2]') and OBJECTPROPERTY(id, N'IsUserTable') =  1 )
drop table at2
GO
CREATE TABLE dbo.at2 (
	f1 int ,
	f2 char( 10 ) )
GO
insert into at2 values( 2 ,'b')
 --||||||||||||||||||||||||||||||||||||||||||||||||||||
 
 --собственно запрос
 
insert into at2(f1,f2)
	select f1,f2 from at1 where not exists(select  1  from at2 where at1.f1=at2.f1)
select * from at2


Т.е. подзапрос
Код: plaintext
not exists(select  1  from at2 where at1.f1=at2.f1)
содержит статические данные и в таблицу вставляется две записи " 3 , c ".

Как сделать так, чтобы подзапрос динамически обновлялся. Т.е. чтобы в таблицу at2 попала только одна запись " 3 , c ". (Вариант с последующим удалением двойников я знаю)
...
Рейтинг: 0 / 0
24.10.2002, 17:58:41
    #32061692
VVG_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как статические данные в условии where превратить в динамические
Может так?

insert into at2(f1,f2)
select distinct f1,f2 from at1 where not exists(select 1 from at2 where at1.f1=at2.f1)
...
Рейтинг: 0 / 0
25.10.2002, 10:25:06
    #32061806
antonz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как статические данные в условии where превратить в динамические
нет, ведь запрос вставляет данные в таблицу условий.
Нужно динамически отслеживать изменения в таблице at2 (очень интересует решение без курсоров)
...
Рейтинг: 0 / 0
25.10.2002, 11:11:17
    #32061834
VVG_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как статические данные в условии where превратить в динамические
IMHO запросы нужно делать так, чтобы неправильные данные в принципе не генерировались, а не пытаться придумать, как их отфильтровывать в процессе вставки.

Что касается distinct - такой запрос в принципе не может вставить противоречивых данных в таблицу, и я не понимаю, почему он не подходит.
...
Рейтинг: 0 / 0
25.10.2002, 12:08:36
    #32061863
antonz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как статические данные в условии where превратить в динамические
содержимое таблиц на перед выполнением
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
at1                     at2
 --------              -------
 
 1      a                 2      b
 2      b
 3      c
 4      d
 2      b
 3      c
 5      f

Данные вставляются из at1 в at2 . И только те, которых нет в at2 . Запись "3 , c" на начало запроса отсутствует в at2 . После выполнения запроса она появится в таблице at2 два раза. А мне нужно - один. В реальности таблицы не такие простые => distinct не подходит.
...
Рейтинг: 0 / 0
25.10.2002, 12:32:30
    #32061872
VVG_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как статические данные в условии where превратить в динамические
Сразу нужно говорить, что и как.

Можно такое использовать:

Код: plaintext
1.
2.
select f1,f2,<любая агрегатная функция>(нужные столбцы)
where .......
group by f1,f2

Или еще как-нибудь посложнее. Вариантов много.

P.S. Больной, не занимайтесь самолечением, доктор сказал в морг - значит в морг!
...
Рейтинг: 0 / 0
25.10.2002, 12:41:45
    #32061878
antonz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как статические данные в условии where превратить в динамические
Конечно, это очень интересно, но меня интересует есть ли способ формировать в условии where динамические данные. Т.е. чтобы после первой вставки "3 , c" в at2 условие where это видело и не вставляло запись еще раз.
...
Рейтинг: 0 / 0
25.10.2002, 12:52:34
    #32061881
Владимир Смирнов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как статические данные в условии where превратить в динамические
Непонятно, чего-же Вы хотите.
Выбираете все записи из at1, кроме тех, которые имеют совпадающие в at2. Затем добавляете этот набор в at2.
Всё получается так, как и задано.
Но Вы считаете, что это неправильно? Или хотите понять, как сделать так, как Вам нужно?
...
Рейтинг: 0 / 0
25.10.2002, 13:10:56
    #32061893
antonz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как статические данные в условии where превратить в динамические
мне нужно, чтобы "кроме тех", обновлялся в процессе запроса
...
Рейтинг: 0 / 0
25.10.2002, 13:34:30
    #32061903
VVG_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как статические данные в условии where превратить в динамические
Как это все работает - он сначала выбирает данные по фильтру, потом складирует их в произвольном месте по своему выбору, и только потом вставляет. К месту складирования если и можно добраться, то только через задницу, которая называется прямое редактирование оперативной памяти.
В сиквеле нет понятия "во время запроса". Запрос во время исполнения - это незавершенная транзакция. Данные, которые изменяются в ней не будут видны ни ей самой, ни остальным. Тут даже isolation level read uncommitted не поможет.
...
Рейтинг: 0 / 0
25.10.2002, 13:37:51
    #32061905
dkstranger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как статические данные в условии where превратить в динамические
Хорошее дополнение "во время запроса"..

Совет - всегда разбивай сложный запрос
на несколько этапов, получишь кучу плюсов

1. Возможность отладки "по частям"
с промежуточным просмотром итогов
2. Возможность эффективного upgrade
когда изменение в одном небольшом
блоке не рушит работу всего запроса
3. Более "прозрачный" вид запроса
4. В большинстве слцчаев резкое повышение
производительности
...
Рейтинг: 0 / 0
25.10.2002, 13:43:59
    #32061908
Владимир Смирнов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как статические данные в условии where превратить в динамические
Так ведь он (SQL Server) сначала выбирает ВСЕ, которые в SELECTе, а потом вставляет ВСЕ, которые выбрал. От этого и отталкивайтесь в своих желаниях. Т.е. сформируйте SELECT так, чтобы выбрались только те записи, которые нужно для последующей вставки.
А тот режим работы, как Вы хотите, я встречал на InterBase. Там запрос типа
Код: plaintext
1.
INSERT INTO A 
SELECT F FROM A

привёл к зацикливанию исполнения. (Я не спец по IB, и если кто-то знает, что это легко обойти, не ругайтесь - я не в упрёк IB, а лишь в качестве примера.)
...
Рейтинг: 0 / 0
25.10.2002, 14:26:20
    #32061939
Rom
Rom
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как статические данные в условии where превратить в динамические
если я правильно понял, то попробуй так
Код: plaintext
1.
2.
3.
insert into at2(f1,f2)
	select a1.f1,a1.f2 from at1 a1 left join at2 a2 on a1.f1=a2.f1 and a1.f2=a2.f2
	where a2.f1 is null
	group by a1.f1, a1.f2
...
Рейтинг: 0 / 0
25.10.2002, 16:38:36
    #32062020
MiCe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как статические данные в условии where превратить в динамические
как говорилось выше - запрос в принципе не делимая сущность...( с оговорками кнечно)....
может тебе это поможет... без курсора... ;))
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
DECLARE @at1 TABLE ([id] INT identity( 1 , 1 ),val1 INT , val2 VARCHAR( 1 ))
DECLARE @at2 TABLE (val1 INT , val2 VARCHAR( 1 ))
INSERT INTO @at1(val1,val2)
SELECT  1 ,'a' UNION ALL SELECT  2 ,'b' UNION ALL
SELECT  3 ,'c' UNION ALL SELECT  4 ,'d' UNION ALL
SELECT  2 ,'b' UNION ALL SELECT  3 ,'c' UNION ALL SELECT  5 ,'f' 
INSERT INTO @at1 SELECT  2 ,'b'
DECLARE @id INT,@maxid INT,@val1 INT,@val2 VARCHAR( 1 )
SELECT @id= 0 ,@maxid=MAX([id]) FROM @at1 
WHILE  1 = 1 
BEGIN
 SELECT TOP  1  @val1=val1,@val2=val2
 FROM @at1 WHERE [id] > @id
 ORDER BY [id]
 IF NOT EXISTS(SELECT * FROM @at2 WHERE val1=@val1 AND val2=@val2) 
   INSERT INTO @at2 SELECT @val1,@val2
 IF @id=@maxid BREAK 
 SELECT @id=MIN([id]) FROM @at1 WHERE [id]>@id 
END
SELECT * FROM @at2
...
Рейтинг: 0 / 0
25.10.2002, 23:40:05
    #32062108
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как статические данные в условии where превратить в динамические
Не знаю чем вам так не подходит distinc/group - вам виднее.
Но если в цикле тогда так примерно

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
set nocount on
if object_id('tempdb..#at1') is not null drop table #at1
create table #at1(f1 int, f2 varchar( 10 ))
insert #at1 values( 1 , 'a')
insert #at1 values( 2 , 'b')
insert #at1 values( 3 , 'c')
insert #at1 values( 4 , 'd')
insert #at1 values( 2 , 'b')
insert #at1 values( 3 , 'c')
insert #at1 values( 5 , 'f')


if object_id('tempdb..#at2') is not null drop table #at2
create table #at2(f1 int, f2 varchar( 10 ))
insert #at2 values( 2 , 'b')

set rowcount  1 
while exists(select * from #at1 a left outer join #at2 b on b.f1 = a.f1 and b.f2 = a.f2 where b.f1 is null)
	insert #at2 select a.* from #at1 a left outer join #at2 b on b.f1 = a.f1 and b.f2 = a.f2 where b.f1 is null
set rowcount  0 

select * from #at2
...
Рейтинг: 0 / 0
27.10.2002, 01:12:46
    #32062166
antonz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как статические данные в условии where превратить в динамические
спасибо всем
Тк, судя по кол-вам просмотров, вопрос заинтересовал многих, привожу еще один вариант, основанный на создании уникального индекса с игнорированием дубликатов
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
if exists (select * from dbo.sysobjects where id = object_id(N'at1') and OBJECTPROPERTY(id, N'IsUserTable') =  1 )
drop table at1
GO
CREATE TABLE at1 (
	f1 int NOT NULL ,
	f2 char( 10 ) NULL 
) ON [PRIMARY]
GO
INSERT INTO at1 values ( 1 ,'a')
INSERT INTO at1 values ( 2 ,'b')
INSERT INTO at1 values ( 3 ,'c')
INSERT INTO at1 values ( 2 ,'d')
INSERT INTO at1 values ( 4 ,'e')
INSERT INTO at1 values ( 3 ,'f')
INSERT INTO at1 values ( 5 ,'i')

if exists (select * from dbo.sysobjects where id = object_id(N'at2') and OBJECTPROPERTY(id, N'IsUserTable') =  1 )
drop table at2
GO
CREATE TABLE at2 (
	f1 int NOT NULL ,
	f2 char( 10 ) NULL 
) ON [PRIMARY]
GO
CREATE  UNIQUE  INDEX IX_at2 ON at2(f1) WITH  IGNORE_DUP_KEY  ON [PRIMARY]
GO
INSERT INTO at2 values ( 2 ,'b')
GO

 -- теперь запрос на вставку весьма прост и проиводит к нужным результатам
 
insert into at2 select * from at1
select * from at2

--delete from at2 where f1<> 2 
...
Рейтинг: 0 / 0
27.10.2002, 15:27:19
    #32062171
MichaelGK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как статические данные в условии where превратить в динамические
antonz , вы как Россия... умом вас не понять. а судя по тому сколь орегинальное решение собственной задчи вы нашли, то и аршином общим не измерить. От лица участников обсуждения хочу предложить вам наш вариант запроса. Он не столь изящен, но вылает тот же самый результат и, к томуже, не генерит ошибку.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[at1]') and OBJECTPROPERTY(id, N'IsUserTable') =  1 )
drop table dbo.at1
GO
CREATE TABLE at1 (
	f1 int ,
	f2 char( 10 ) )
GO
INSERT INTO at1 values ( 1 ,'a')
INSERT INTO at1 values ( 2 ,'b')
INSERT INTO at1 values ( 3 ,'c')
INSERT INTO at1 values ( 2 ,'d')
INSERT INTO at1 values ( 4 ,'e')
INSERT INTO at1 values ( 3 ,'f')
INSERT INTO at1 values ( 5 ,'i')

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[at2]') and OBJECTPROPERTY(id, N'IsUserTable') =  1 )
drop table at2
GO
CREATE TABLE dbo.at2 (
	f1 int ,
	f2 char( 10 ) )
GO

 --собственно запрос
 
insert into at2(f1,f2)
	select f1,min(f2) from at1 where not exists(select  1  from at2 where at1.f1=at2.f1) group by at1.f1
select * from at2
...
Рейтинг: 0 / 0
28.10.2002, 10:35:25
    #32062226
antonz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как статические данные в условии where превратить в динамические
-> MichaelGK
что уж тут непонятно? Я не спрашиваю как написать SELECT.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как статические данные в условии where превратить в динамические / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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