Не работает пересечение :(

popotam2
Дата: 13.09.2006 10:37:12
Привет!

Есть таблица, по ней осуществляется поиск, использую примеры с ASPNETmania для пересечения множеств, но там внизу приписочка, что, мол, работает для неповторяющихся значений. А что делать если значения пересекаются?

CREATE TABLE FOLDERS 
        (
           UID BIGINT,
           PID BIGINT,
           CODE varchar(255),
           FOLDERNAME varchar(255),
           CSID bigint 
         )

   ///

select PID from
 (
     
	select  pid, 1 AS TAB_ID from folders where  (code like '%Б%')  and CSID in (154,181) 
	union all
	select  pid, 2 AS TAB_ID from folders where  foldername like '%ДНС%' and CSID in (155,182)  
        union all
	select  pid, 4 AS TAB_ID from folders where  (code like '%КА%')  and CSID in (162,183,184) 
     
 )  SUPERTAB group by PID HAVING SUM(TAB_ID)=7

Так вот в результате возвращается очень мало из реально нужных значений! Каждый из этих select'ов может вернуть несколько одинаковых значений PID...
А если еще посмотреть что возвращает SUM(TAB_ID) - то там много значений БОЛЬШЕ 7!
Подскажите что делать?
pkarklin
Дата: 13.09.2006 10:39:58
автор
А если еще посмотреть что возвращает SUM(TAB_ID) - то там много значений БОЛЬШЕ 7!


Еще бы знать, что Вы хотите получить?
Владимор Конев
Дата: 13.09.2006 10:42:10
Не совсем понял сути вопроса, но вот на всякий случай:
Тынц - Работа с множествами в T-SQL
Владимор Конев
Дата: 13.09.2006 10:44:42
Владимор Конев
Не совсем понял сути вопроса, но вот на всякий случай:
Тынц - Работа с множествами в T-SQL
А, пардон...
Я же тебя на ту же самую ASPNETmania и отправил...
popotam2
Дата: 13.09.2006 10:45:51
Таблица FOLDERS это некое дерево, где PID каждой ветки показывает на Самого корневого родителя. Я хочу осуществить поиск по всем веткам, у которых на первом уровне одно значение CODE и FOLDERNAME, на втором другое, на третьем - третье соответственно.
Я выбираю все ветки первого уровня удовлетворяющие условию №1, потом второго уровня и т.д. В итоге получится множество PID. Так вот мне нужны все PID, для которых выполнились все три условия.
p.s. дерево строится по оригинальной технологии, поэтому PID показывает не на прямого родителя а на самого корневого.
alexeyvg
Дата: 13.09.2006 11:26:12
popotam2
А если еще посмотреть что возвращает SUM(TAB_ID) - то там много значений БОЛЬШЕ 7!
Интересно, как по SUM(TAB_ID) можно узнать, сколько значений вы получили?
popotam2
Дата: 13.09.2006 13:04:07
alexeyvg
Интересно, как по SUM(TAB_ID) можно узнать, сколько значений вы получили?

На ASPNETmania - пример (ссылка была выше). Если SUM(TAB_ID) - будет равно 7, значит точно присутствует выборка из каждой таблицы. А уменя получается больше.
pkarklin
Дата: 13.09.2006 13:47:04
Ну так значит у Вас из каждой таблицы выбирается более чем 1 запись.
alexeyvg
Дата: 13.09.2006 14:45:43
popotam2
На ASPNETmania - пример (ссылка была выше). Если SUM(TAB_ID) - будет равно 7, значит точно присутствует выборка из каждой таблицы.
Совершенно не значит.

Вот пример:
   insert FOLDERS values(1, 1, 'БББ', '', 154)
   insert FOLDERS values(1, 1, 'БББ', '', 154)
   insert FOLDERS values(1, 1, 'БББ', '', 154)
   insert FOLDERS values(1, 1, 'БББ', '', 154)
   insert FOLDERS values(1, 1, 'БББ', '', 154)
   insert FOLDERS values(1, 1, 'БББ', '', 154)
   insert FOLDERS values(1, 1, 'БББ', '', 154)

select PID from
 (
	select  pid, 1 AS TAB_ID from folders where  (code like '%Б%')  and CSID in (154,181) 
	union all
	select  pid, 2 AS TAB_ID from folders where  foldername like '%ДНС%' and CSID in (155,182)  
        union all
	select  pid, 4 AS TAB_ID from folders where  (code like '%КА%')  and CSID in (162,183,184)
 )  SUPERTAB group by PID HAVING SUM(TAB_ID)=7
Shaman_Naydak
Дата: 13.09.2006 20:48:04
Ну ежели в лоб, то
HAVING SUM(DISTINCT TAB_ID)=7