Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Возможен ли такой запрос или как работать с множествами в SQL. / 11 сообщений из 11, страница 1 из 1
26.10.2004, 11:56:05
    #32754433
Рачаев Олег
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возможен ли такой запрос или как работать с множествами в SQL.
Главные актеры:

Таблицы

t_skv_geo(geo_id,geo_date,skv_id)

t_geo_plasts(geo_id,plast_id) -для развязки отношения M:M

t_plast(plast_id,plast_name) - справочник

Запрос

SELECT geo_id FROM t_skv_geo AS T1 WHERE (geo_date=... AND skv_id=... AND (SELECT plast_id FROM t_geo_plasts AS T2 WHERE T2.geo_id=T1.geo_id) IN (..., ..., ...) )

НЕ РАБОТАЕТ!! Пишет : "Подзапрос должен возвращать одно значение". Научите как написать запрос с критерием "множ-во = множ-во".
...
Рейтинг: 0 / 0
26.10.2004, 12:17:21
    #32754521
4321
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возможен ли такой запрос или как работать с множествами в SQL.
авторAND (SELECT plast_id FROM t_geo_plasts AS T2 WHERE T2.geo_id=T1.geo_id) IN (..., ..., ...)
ничего не понял, но кажется ты хочешь:
авторAND EXISTS
(
SELECT * FROM t_geo_plasts AS T2 WHERE T2.geo_id=T1.geo_id AND plast_id IN (..., ..., ...)
)
...
Рейтинг: 0 / 0
26.10.2004, 12:31:53
    #32754568
Рачаев Олег
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возможен ли такой запрос или как работать с множествами в SQL.
4321,
Это не то. Мне нужна проверка на равенство множеств, т.е. чтобы множество
возвращаемых значений подзапроса было РАВНО или идентично по своему составу множесту, которое я задаю (..., ..., ..., ...)
...
Рейтинг: 0 / 0
26.10.2004, 13:04:12
    #32754715
Раз (1)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возможен ли такой запрос или как работать с множествами в SQL.
Если я правильно понял (прошу прощения за синтаксис T-SQL):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SELECT
  COUNT(*)
FROM
  (
    SELECT
      t_skv_geo.geo_id AS id1 ,
      t_geo_plasts.geo_id AS id2
    FROM
      t_skv_geo
      FULL OUTER JOIN
        t_geo_plasts
      ON( t_skv_geo.geo_id = t_geo_plasts.geo_id )
  ) a
WHERE
  a.id1 + a.id2 IS NULL
Если возвращен ноль - то типа множества идентичны
...
Рейтинг: 0 / 0
26.10.2004, 13:05:46
    #32754727
Раз (1)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возможен ли такой запрос или как работать с множествами в SQL.
да, вместо t_geo_plasts имелся в виду t_plast
...
Рейтинг: 0 / 0
26.10.2004, 13:23:59
    #32754812
4321
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возможен ли такой запрос или как работать с множествами в SQL.
не помню как в MS, но это или при помощи EXCEPT или INTERSECT (кажется) решается, а в нашем случае ограниченного воспоминание о T-SQL достаточно. если IN() не слишком большое, добавить кроме

NOT EXISTS(SELECT * WHERE ... AND p_id NOT IN())
(нет других)
перечислить для каждого:
EXISTS(SELECT * WHERE p_id =... ) AND EXISTS(SELECT * WHERE p_id =... )
(есть каждый)

А луч-че сходить на форум по T-SQL


___
Ах, да, пофантазируйте на тему:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
NOT EXISTS(SELECT * WHERE ... AND p_id NOT IN()) 
-- нет не входящих в IN()
AND
-- а входящие в ин()
NOT EXISTS(
-- полностью совпадают с наличными в
(SELECT p_id  WHERE ... AND p_id  IN(...)) AS Q1
--все, входящие в ин()
 LEFT JOIN 
(SELECT p_id  WHERE ... ) AS Q2 
-- Все, не только входящие
WHERE Q2.p_id IS NULL
-- полностью совпадают
)
...
Рейтинг: 0 / 0
26.10.2004, 13:40:16
    #32754873
Рачаев Олег
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возможен ли такой запрос или как работать с множествами в SQL.
Ну Вы меня совсем запутали ... даже не знаю как теперь быть ...

T-SQL я не знаю, поэтому конструкция с FULL OUTER JOIN - для меня темный лес. Как это будет выглядеть в LEFT,INNER джойнах ?

4321 предлагает добавить следующий критерий, я правильно понял?
Если множество-критерий (p1,p2,...), то сравнение множеств будет производиться так:

... AND EXISTS( SELECT * FROM t_geo_plasts WHERE T2.geo_id=T1.geo_id AND plast_id =p1 )
AND EXISTS(SELECT * FROM t_geo_plasts WHERE T2.geo_id=T1.geo_id AND plast_id =p2 )
AND EXISTS(SELECT * FROM t_geo_plasts WHERE T2.geo_id=T1.geo_id AND plast_id =... )


ТАК? Ну это же супер гемор! Особенно в случае программного формирования(что у меня и происходит). Неужели нет пути попроще?
...
Рейтинг: 0 / 0
26.10.2004, 13:46:15
    #32754889
4321
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возможен ли такой запрос или как работать с множествами в SQL.
Я ж сказал "пофантазируйте" (я там, кажется наборы местами попутал - надо б тогда Right и Q1.p_id IS NULL)

Кажется вот так почти правильно
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
NOT EXISTS(SELECT * WHERE ... AND p_id NOT IN()) 
-- нет не входящих в IN()
AND
-- а входящие в ин()
NOT EXISTS(
-- полностью совпадают с наличными в
(
(SELECT p_id  WHERE ... ) AS Q1
-- Все, не только входящие
 LEFT JOIN 
SELECT p_id  WHERE ... AND p_id  IN(...)) AS Q2
--все, входящие в ин()
WHERE Q2.p_id IS NULL
-- полностью совпадают
)
...
Рейтинг: 0 / 0
26.10.2004, 13:54:30
    #32754913
4321
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возможен ли такой запрос или как работать с множествами в SQL.
и, есс-но

SELECT ??? WHERE

читать:

SELECT ??? FROM t_geo_plasts WHERE
...
Рейтинг: 0 / 0
26.10.2004, 14:03:36
    #32754934
4321
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возможен ли такой запрос или как работать с множествами в SQL.
продолжаем спать
в фантазиях LEFT джойн ес-но по полю p_id
(структура фантазий далека, как видим, от четкой конкретики конечной реализации)
Не претендуя полную корректность:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
NOT EXISTS(SELECT * FROM t_geo_plasts p WHERE ... AND p.p_id NOT IN(...)) 
AND
NOT EXISTS(
(
(SELECT plast_id p_id FROM t_geo_plasts p WHERE ... )
 AS Q1
  LEFT JOIN 
(SELECT plast_id  p_id  FROM t_geo_plasts p WHERE ... AND p.p_id  IN(...))
 AS Q2
 ON Q1.p_id=Q2.p_id
   WHERE Q2.p_id IS NULL
)
...
Рейтинг: 0 / 0
26.10.2004, 14:17:04
    #32754972
4321
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возможен ли такой запрос или как работать с множествами в SQL.
По поводу FULL OUTER JOIN - это (по набору) просто UNION (без ALL) от RIGHT и LEFT. (должен только чуть резвее считаться чем такая юнион-конструкция).

Он тут поможет, если запихать набор In(...,....) в некий набор, например:

SELECT ...
UNION
SELECT ...
....
UNION
SELECT ...

А уж с ним вязаться FULL OUTER JOIN - ом.
Или, если выбросить первый запрос в том, что я налепил чуть выше, и сделать:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
NOT EXISTS(
(
(SELECT plast_id p_id FROM t_geo_plasts p WHERE ... )
 AS Q1
  FULL OUTER JOIN 
(SELECT plast_id  p_id  FROM t_geo_plasts p WHERE ... AND p.p_id  IN(...))
 AS Q2
 ON Q1.p_id=Q2.p_id
   WHERE Q2.p_id IS NULL OR Q1.p_id IS NULL
)
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Возможен ли такой запрос или как работать с множествами в SQL. / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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