Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 запрос реляционное деление  [new]
ned help
Guest
Добрый день всем. Кто на примере двух таблиц сможет мне показать как писать такие запросы. Таблицы привожу
Интуитивно понятно что происходит , а вот как это написать на sql не понятно.

Итак ,таблицы
Пусть даны следующие соотношения:

Мульфильмы

Код_мульта Название_мульта Название_канала
0 The Simpsons RenTV
0 The Simpsons 2х2
0 The Simpsons CTC
1 Family Guy RenTV
1 Family Guy 2х2
2 Duck Tales СТС
2 Duck Tales 2x2

Тогда при делении на таблицу каналов:

Каналы

Название_канала
RenTV
2х2

Результатом будет:


Код_мульта Название_мульта
0 The Simpsons
1 Family Guy

Family Guy и The Simpsons — мультфильмы, которые показывались и на RenTV и на 2x2 (условие во второй таблице). При этом Duck Tales не показывалось по RenTV, потому был исключён из результирующей таблицы.

Эквивалентный SQL-запрос кто сможет ?
21 авг 11, 15:55    [11153221]     Ответить | Цитировать Сообщить модератору
 Re: запрос реляционное деление  [new]
ned help
Guest
ned help,

И еще было бы прекрасно если бы кто сказал как это проверять. То есть обратную операции для рел/деления. Я почему - то думаю что это никак не рел. умножение
21 авг 11, 16:01    [11153228]     Ответить | Цитировать Сообщить модератору
 Re: запрос реляционное деление  [new]
invm
Member

Откуда: Москва
Сообщений: 9838
select
 Название_мульта
from
 Мульфильмы
group by
 Название_мульта
having
 count(distinct Название_канала) = (select count(*) from Каналы);
21 авг 11, 16:25    [11153258]     Ответить | Цитировать Сообщить модератору
 Re: запрос реляционное деление  [new]
ned help
Guest
invm,

Спасибо большое. Но это фокус. Мне бы хотелось что - нибудь стандартное с divideby если можно
21 авг 11, 16:29    [11153265]     Ответить | Цитировать Сообщить модератору
 Re: запрос реляционное деление  [new]
qwerty112
Guest
ned help
invm,

Спасибо большое. Но это фокус. Мне бы хотелось что - нибудь стандартное с divideby если можно

вы, эта..., определитесь, вы "теоретик" или "практик"

19.2. Реляционное деление
21 авг 11, 17:18    [11153315]     Ответить | Цитировать Сообщить модератору
 Re: запрос реляционное деление  [new]
ned help
Guest
qwerty112,

я хочу просто понять как таблицу из двух столбцов разделить на таблицу из одного столбца используя divideby.
я хочу посмотреть синтаксис этого оператора.
я хочу увидеть кусок кода где используется
этот оператор
я даже не знаю как точно пишется этот оператор. Так divided by или так divideby
21 авг 11, 17:33    [11153330]     Ответить | Цитировать Сообщить модератору
 Re: запрос реляционное деление  [new]
Павел Воронцов
Member

Откуда: Новосибирск
Сообщений: 2392
Блог
ned help
qwerty112,

я хочу просто понять как таблицу из двух столбцов разделить на таблицу из одного столбца используя divideby.
я хочу посмотреть синтаксис этого оператора.
я хочу увидеть кусок кода где используется
этот оператор
я даже не знаю как точно пишется этот оператор. Так divided by или так divideby
Фишка в том, что это оператор реляционной алгебры, а не языка SQL. В чистом виде не встречается. Реляционная ашгебра избыточна - операция деления может быть выполнена с помощью набора других операций.
21 авг 11, 17:42    [11153343]     Ответить | Цитировать Сообщить модератору
 Re: запрос реляционное деление  [new]
qwerty112
Guest
ned help
qwerty112,

я хочу просто понять как таблицу из двух столбцов разделить на таблицу из одного столбца используя divideby.
я хочу посмотреть синтаксис этого оператора.
я хочу увидеть кусок кода где используется
этот оператор
я даже не знаю как точно пишется этот оператор. Так divided by или так divideby

НЕТ в Т-СКЛ такого оператора,
по ссылке выше - варианты реализации "реляционного деления" на тех операторах Т-СКЛ, которые ЕСТЬ

вот поэтому я вас и спрашиваю, вы хотите использовать на практике реляционное деление ?
или вас интересуют "теоретеческие изыски", где это (DIVIDEBY . . . PER) - есть ?
21 авг 11, 17:44    [11153346]     Ответить | Цитировать Сообщить модератору
 Re: запрос реляционное деление  [new]
ned help
Guest
qwerty112,

хорошо понял. Тогда теория. Смотрите вы мне выслали ссылку - там все очень хорошо спасибо. Ну так вот мне бы хотелось в коде будет решена первая задача. п 19.2 При условии что таблицы уже есть. То есть просто деление

Это почти мой случай, но только не могу же я написать что - то в виде PilotSkills DIVIDED BY Hangar
Мне из моей первой таблицы еще надо вычленить эти два столбца и я знаю как это делать. Я не знаю как связать результат с оператором деления. Среда sql 92
21 авг 11, 17:50    [11153354]     Ответить | Цитировать Сообщить модератору
 Re: запрос реляционное деление  [new]
ned help
Guest
Ок тему можно закрывать. Нет оператора - нет темы
21 авг 11, 18:03    [11153378]     Ответить | Цитировать Сообщить модератору
 Re: запрос реляционное деление  [new]
qwerty112
Guest
ned help
qwerty112,

хорошо понял. Тогда теория. Смотрите вы мне выслали ссылку - там все очень хорошо спасибо. Ну так вот мне бы хотелось в коде будет решена первая задача. п 19.2 При условии что таблицы уже есть. То есть просто деление

Это почти мой случай, но только не могу же я написать что - то в виде PilotSkills DIVIDED BY Hangar
Мне из моей первой таблицы еще надо вычленить эти два столбца и я знаю как это делать. Я не знаю как связать результат с оператором деления. Среда sql 92

насколько я понял из этого
http://www.az-design.ru/index.shtml?Support&DataBase&SQL/CelkoJ/01h019
В шестом издании своей книги Introduction to Database Systems (Date, 1995a) Крис Дэйт определил еще один оператор (DIVIDEBY . . . PER),

это (DIVIDED BY) - никакой НЕ стандарт, ни 89, ни 92
21 авг 11, 18:07    [11153384]     Ответить | Цитировать Сообщить модератору
 Re: запрос реляционное деление  [new]
qwerty112
Guest
Павел Воронцов
Фишка в том, что это оператор реляционной алгебры, а не языка SQL. В чистом виде не встречается. Реляционная ашгебра избыточна - операция деления может быть выполнена с помощью набора других операций.

+1

invm
select
 Название_мульта
from
 Мульфильмы a inner join каналы b on a.Название_канала=b.Название_канала
group by
 Название_мульта
having
 count(distinct Название_канала) = (select count(*) from Каналы);

SELECT distinct Название_мульта
  FROM Мульфильмы  AS P1
 WHERE (select count(*) from
       (SELECT Название_канала
          FROM каналы 
        EXCEPT 
        SELECT Название_канала
          FROM Мульфильмы  AS P2 
         WHERE P1.Название_мульта = P2.Название_мульта)a) = 0
21 авг 11, 18:12    [11153392]     Ответить | Цитировать Сообщить модератору
 Re: запрос реляционное деление  [new]
7590
Guest
qwerty112, да это другое

вот вот - путаница сразу в двух местах у меня.
1. Стандарт и оператор
2. Написание
Я понял вообщем все - нет divideby в sql и в примере другое.
Всем спасибо - буду комбинировать.
21 авг 11, 18:13    [11153393]     Ответить | Цитировать Сообщить модератору
 Re: запрос реляционное деление  [new]
iljy
Member

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

оператора нет, а способы реализации есть. Их вам уже много привели.

И да, был еще вопрос об обратной операции. Она есть, и называется "декартово произведение", в скуле ей соответствует операция CROSS JOIN. Проблема только в том, что реляционное деление идет с потерей информации, соответственно в общем случае эта операция необратима.
21 авг 11, 19:24    [11153524]     Ответить | Цитировать Сообщить модератору
 Re: запрос реляционное деление  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Как реализовать операцию реляционной алгебры "деление" на SQL?
21 авг 11, 20:33    [11153711]     Ответить | Цитировать Сообщить модератору
 Re: запрос реляционное деление  [new]
ned help
Guest
iap, ОК

Отлично спасибо. Но поясните мне. Что есть YY , XXX, YY.B
SELECT DISTINCT X.A
FROM X
WHERE NOT EXISTS
(
SELECT *
FROM Y YY
WHERE NOT EXISTS
(
SELECT * FROM X XXX WHERE XXX.A=X.A AND XXX.B=YY.B
)
)
Мое понимание ограничивается тем, что такое A.X и просто Y
21 авг 11, 21:28    [11153885]     Ответить | Цитировать Сообщить модератору
 Re: запрос реляционное деление  [new]
iljy
Member

Откуда:
Сообщений: 8711
ned help
Отлично спасибо. Но поясните мне. Что есть YY , XXX, YY.B

Это есть псевдонимы (alias). Для каждой таблицы в запросе можно задать псевдоним, и хорошим стилем будет задавать его всегда. И это просто необходимо, когшда одна таблица входит в запрос несколько раз.
21 авг 11, 22:36    [11154183]     Ответить | Цитировать Сообщить модератору
 Re: запрос реляционное деление  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
ned help,

Я там в каждом уровне вложенности использовал алиас длиннее на один символ, чем на предыдущем.
Это, как Вы понимаете, совсем необязательно. Просто придумывать имена разных алиасов было чего-то лень...

Вот мне показалась очень интересной ссылка, котрую тут давали 11153315
Когда мы обсуждали реляционное деление в той, старой, теме, ничего подобного найти не удалось. :(
22 авг 11, 11:09    [11155446]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить