Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.02.2010, 20:01   #1
Mayya
Новичок
Джуниор
 
Регистрация: 16.02.2010
Сообщений: 1
По умолчанию Операции реляционной алгебры

Помогите пожалуйста, как описать операции: пересечение (INTERSECT), вычитание (MINUS) и произведение (TIMES) для двух таблиц R1, R2 с одинаковыми полями (Тип, Дальность, Кол_пасс).
Пожалуйста помогите!
Mayya вне форума Ответить с цитированием
Старый 17.02.2010, 12:02   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

так не пойдет
exists
not exists
union
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 16.08.2010, 10:48   #3
Sparkman
220400
Форумчанин
 
Аватар для Sparkman
 
Регистрация: 21.05.2010
Сообщений: 726
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
так не пойдет
exists
not exists
union
мне нужно вычесть из одной таблицы другую (поля одинаковые)..
использую not exists?

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

Таблица 1(уменьшаемое)
Код:
create table temp
(id int identity,
 surname varchar(50),
 name varchar(50),
 secondname varchar(50),
 sex bit,
 birthday datetime,
 street_name varchar(50),
 house_nl varchar(10),
 flat_number int)
Таблица2(вычитаемое)
Код:
create table tPeople
(id uniqueidentifier DEFAULT NEWID(),
 surname varchar(50),
 name varchar(50),
 secondname varchar(50),
 sex bit,
 birthday datetime,
 street_name varchar(50),
 house_nl varchar(10),
 flat_number int)
Бесплодные попытки
Код:
select t.* from
temp t
where not exists(
select	*
from	tpeople p
where	p.surname=t.surname
	and	p.name=t.name
	and	p.secondname=t.secondname
	and	p.birthday=t.birthday
	and	p.street_name=t.street_name
	and	p.house_nl=t.house_nl
	and	p.flat_number=t.flat_number
)
Код:
select t.* from
temp t
where	not exists (select surname from tpeople where surname=t.surname)
and not exists  (select name from tpeople where name=t.name)
and not exists  (select secondname from tpeople where secondname=t.secondname)
and not exists  (select birthday from tpeople where birthday=t.birthday)
and not exists  (select street_name from tpeople where street_name=t.street_name)
and not exists  (select house_nl from tpeople where house_nl=t.house_nl)
and not exists  (select flat_number from tpeople where flat_number=t.flat_number)
Cерьёзной помощи не ждите - помогаю в перерывах на "перекур".
Не существует ничего невозможного для человека, который не собирается ничего делать сам.
Не учите человека, если вы не его учитель.

Последний раз редактировалось Sparkman; 16.08.2010 в 10:52.
Sparkman вне форума Ответить с цитированием
Старый 16.08.2010, 12:36   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Для СВОИХ вопросов создавайте СВОЮ тему

Код:
select t.* from
temp t
where	not exists (select surname from tpeople where surname=t.surname)
вот так (вычитание по ОДНОМУ полю) работает ?

цруку not exists () and not exists ()
это ПЕРЕСЕЧЕНИЕ вычитаний по разным полям.
При большим кол-ве полей результат с большой вероятностью пустым

вам вероятно надо вычитание по нескольким полям одновременно
Код:
select t.* from
temp t
where	not exists (select surname from tpeople where surname=t.surname
and <другое поле>=t.<другое поле>)
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 17.08.2010, 04:41   #5
Sparkman
220400
Форумчанин
 
Аватар для Sparkman
 
Регистрация: 21.05.2010
Сообщений: 726
Печаль

Цитата:
Сообщение от evg_m Посмотреть сообщение
Для СВОИХ вопросов создавайте СВОЮ тему
*перечитал правила форума*, прошу прощения.., но, что делать если тема не исчерпана?

Цитата:
Сообщение от evg_m Посмотреть сообщение
Код:
select t.* from
temp t
where	not exists (select surname from tpeople where surname=t.surname)
вот так (вычитание по ОДНОМУ полю) работает ?
Да работает

Цитата:
Сообщение от evg_m Посмотреть сообщение
цруку not exists () and not exists ()
это ПЕРЕСЕЧЕНИЕ вычитаний по разным полям.
При большим кол-ве полей результат с большой вероятностью пустым

вам вероятно надо вычитание по нескольким полям одновременно
Код:
select t.* from
temp t
where	not exists (select surname from tpeople where surname=t.surname
and <другое поле>=t.<другое поле>)
да мне нужно вычитание по нескольким полям
к сожалению ваш последний пример, это дублирование моей второй бесплодной попытки
Cерьёзной помощи не ждите - помогаю в перерывах на "перекур".
Не существует ничего невозможного для человека, который не собирается ничего делать сам.
Не учите человека, если вы не его учитель.

Последний раз редактировалось Sparkman; 17.08.2010 в 05:06.
Sparkman вне форума Ответить с цитированием
Старый 17.08.2010, 13:12   #6
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Код:
select * from 
( select 1 f1, 12 f2 union select 2, 12 union select 3, 11 union select 2, 11 union select 1, 11 ) t1 
where not exists ( select * from 
( select 1 f1, 12 f2 union select 2, 12 ) t2
     where t2.f1=t1.f1 and t2.f2=t1.f2 )
t1
1 11
1 12
2 11
2 12
3 11

t2
1 12
2 12

res
1 11
2 11
3 11
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Раздел Алгебры Логики Базиля Помощь студентам 1 23.12.2009 00:13