Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / minus в PL/SQL, а как в TransactSQL ? / 14 сообщений из 14, страница 1 из 1
31.10.2002, 15:17:18
    #32063661
Федин Юрий
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
minus в PL/SQL, а как в TransactSQL ?
Всем привет.

В Оракле можно вычесть из одного множества другое таким образом

select aa from bb
minus
select aa from cc

(Операция вычитания над множествами, как union - операция сложения)

А в MS SQL Server union есть, а как сделать вычитание ?
...
Рейтинг: 0 / 0
31.10.2002, 15:21:13
    #32063665
vap
vap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
minus в PL/SQL, а как в TransactSQL ?
Код: plaintext
1.
SELECT * FROM Table1 
WHERE Id NOT IN (SELECT Id FROM Table2)
Можно еще NOT EXISTS применить.
...
Рейтинг: 0 / 0
31.10.2002, 15:28:04
    #32063672
VVG_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
minus в PL/SQL, а как в TransactSQL ?
А еще пошустрее будет такой вариантик:

Код: plaintext
1.
2.
select * from table1 
left outer join table2 on table1.id=table2.id
where table2.id is null
...
Рейтинг: 0 / 0
31.10.2002, 15:39:06
    #32063679
mishgan2000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
minus в PL/SQL, а как в TransactSQL ?
Я обычно использую NOT EXISTS
А если быть совсем точным, то в PL/SQL тоже нет оператора MINUS
...
Рейтинг: 0 / 0
31.10.2002, 15:59:11
    #32063691
Федин Юрий
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
minus в PL/SQL, а как в TransactSQL ?
Всем спасибо.

Идея понятна.

Правда я не знал как быть с множеством.

Две таблицы, без всяких связей по id и т.д.

Допустим в них есть поля ДАТА, СУММА

И по ним и надо найти разницу.

Я все превратил в строки, объединил из в одно поле и на этом поле сделал not in...

Спасибо еще раз.
...
Рейтинг: 0 / 0
31.10.2002, 16:41:12
    #32063724
MiCe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
minus в PL/SQL, а как в TransactSQL ?
Я все превратил в строки, объединил из в одно поле и на этом поле сделал not in.
так не эффективно....нуно так
Код: plaintext
1.
2.
3.
4.
5.
select * 
from tableAll a
where NOT EXISTS(select top  1  * 
                 from tableMinus m
                 where m.data=a.data and
                       m.summa=a.summa)
...
Рейтинг: 0 / 0
31.10.2002, 17:21:42
    #32063737
jimmers
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
minus в PL/SQL, а как в TransactSQL ?
2VVG_

Вы заблуждаетесь, на средних и больщих объемах данных (миллион, скажем), Ваш
вариант намного более долгий. Сам на этом попался.

Код: 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.
35.
36.
37.
38.
39.
40.
41.
SET NOCOUNT ON
GO
CREATE DATABASE DB1
GO
USE DB1
GO
CREATE TABLE T1 (id int identity primary key, v1 varchar( 100 ))
CREATE TABLE T2 (id int identity primary key, v1 varchar( 100 ))
GO
declare @i int
set @i =  1 
while @i <  1000000 
begin
  INSERT T1 VALUES (CAST(@i as varchar))
  set @i = @i +  1 
end
GO
declare @i int
set @i =  500000 
while @i <  1000000 
begin
  INSERT T2 VALUES (CAST(@i as varchar))
  set @i = @i +  1 
end

'Table 'T1'. Scan count 2, logical reads 5660, physical reads 0, read-ahead reads 0.
'Table 'T2'. Scan count  2 , logical reads  2846 , physical reads  0 , read-ahead reads  0 .

'SQL Server Execution Times:
   CPU time = 3719 ms,  elapsed time = 8867 ms.
select * from T1
left outer join T2 on T1.id=T2.id
where T2.id is null

'Table 'T1'. Scan count  1 , logical reads  2830 , physical reads  0 , read-ahead reads  0 .
'Table 'T2'. Scan count 1, logical reads 1423, physical reads 0, read-ahead reads 0.

'SQL Server Execution Times:
   CPU time =  2578  ms,  elapsed time =  6472  ms.
SELECT * FROM T1 
WHERE id NOT IN (SELECT id FROM T2)


2MiCe:

Что-то не то... Все выводит.
...
Рейтинг: 0 / 0
31.10.2002, 19:15:14
    #32063780
MiCe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
minus в PL/SQL, а как в TransactSQL ?
2 jimmers
при всем уважении... но
Код: 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.
35.
36.
37.
38.
SET NOCOUNT ON
GO
CREATE DATABASE DB1
GO
USE DB1
GO
CREATE TABLE T1 (id int identity primary key, v1 varchar( 100 ))
CREATE TABLE T2 (id int identity primary key, v1 varchar( 100 ))
GO
declare @i int
set @i =  1 
while @i <  1000 
begin
  INSERT T1 VALUES (CAST(@i as varchar))
  set @i = @i +  1 
end
 -- таблица T1 - id = v1
 
GO
declare @i int
set @i =  500 
while @i <  1000 
begin
  INSERT T2 VALUES (CAST(@i as varchar))
  set @i = @i +  1 
end
 -- таблица T2 - v1=id+500
 
GO
SELECT *
FROM T1
WHERE NOT EXISTS(SELECT TOP  1  id FROM T2 WHERE T2.id=T1.id)
GO
 -- result 501,501 ..... 999,999
 
 -- в первой таблице id - 1....999 во второй 1....500
 
DROP DATABASE DB1
...
Рейтинг: 0 / 0
31.10.2002, 19:15:15
    #32063781
VVG_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
minus в PL/SQL, а как в TransactSQL ?
2 jimmers:

Хотел сейчас вспомнить, почему я так решил, и пример найти, где outer join быстрее - не смог.
...
Рейтинг: 0 / 0
01.11.2002, 00:31:05
    #32063807
jimmers
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
minus в PL/SQL, а как в TransactSQL ?
2MiCe

Поправьте меня, если я не прав, но Ваш вариант был такой для моих таблиц:

Код: plaintext
1.
2.
3.
4.
5.
6.
select * 
from T1 a
where NOT EXISTS(select top  1  * 
                 from T2 m
                 where m.v1=a.v1 and
                       m.id=a.id)


То есть Две таблицы, без всяких связей по id и т.д. - игнорируем, что
id PK.

Вот и выходит тут все N записей...

Удачи
...
Рейтинг: 0 / 0
01.11.2002, 09:42:16
    #32063853
nn
nn
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
minus в PL/SQL, а как в TransactSQL ?
Вообще-то есть: EXCEPT - синоним MINUS-а
...
Рейтинг: 0 / 0
01.11.2002, 10:58:16
    #32063892
MiCe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
minus в PL/SQL, а как в TransactSQL ?
2 jimmers
во первых в своем примере данных вы связываете по id...
во вторых у вас при связывании по(id,v1) таблицы вообще не пересекаются.....(нужно или id , или v1)!
самый первый пример что вы щас цитируете был по сабжу топика..... чел хотел связать по дате и сумме....
...
Рейтинг: 0 / 0
01.11.2002, 11:00:09
    #32063893
MiCe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
minus в PL/SQL, а как в TransactSQL ?
2 jimmers
во первых в своем примере данных вы связываете по id...
во вторых у вас при связывании по(id,v1) таблицы вообще не пересекаются.....(нужно или id , или v1)!
самый первый пример что вы щас цитируете был по сабжу топика..... чел хотел связать по дате и сумме....
...
Рейтинг: 0 / 0
01.11.2002, 11:20:14
    #32063904
jimmers
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
minus в PL/SQL, а как в TransactSQL ?
2MiCe

Вы правы, признаю свою ошибку.

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


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