Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Соеденене по наборам  [new]
Дис
Member

Откуда: Таганрог
Сообщений: 21
Сразу извиняюсь за сумбурное описание, но проблема в том что не знаю и не могу сформулировать точное название такого "join'а"(возможно если б смог не создавал тему :)).

Есть следующий набор данных (1st table):
IDTicketID
110
111
112
210
211
310
312
411
412
510
611
712


нужно "сджойнить" его с (2nd table):
TicketID
10
11
12


именно как набор данных, то есть в результате должно получится:
IDTicketID(1st table)TicketID(2nd table)
110 10
11111
11212


Таким образом если вторая таблица заменяется на:
TicketID
10
12


получим:
IDTicketID(1st table)TicketID(2nd table)
310 10
31212


, а если на:
TicketID
12


получаем:
IDTicketID(1st table)TicketID(2nd table)
71212
2 фев 12, 18:41    [12021960]     Ответить | Цитировать Сообщить модератору
 Re: Соеденене по наборам  [new]
count(*) = count(*)
Guest
select *
from (
select t1.id
from [1st table] t1
inner join [2st table] t2 on t1.TicketID= t2.TicketID
group by t1.id
having count(*) = (select count(*) from [2st table])
) g cross join [2st table]
2 фев 12, 18:55    [12022009]     Ответить | Цитировать Сообщить модератору
 Re: Соеденене по наборам  [new]
Дис
Member

Откуда: Таганрог
Сообщений: 21
count(*) = count(*),
это не работает ни для 2го ни для 3го случая вариаций таблицы #2.

И сразу апдейт:
Представлять значения таблицы #2 в виде строки нельзя ('10,11,12')
2 фев 12, 19:03    [12022042]     Ответить | Цитировать Сообщить модератору
 Re: Соеденене по наборам  [new]
grinya
Member

Откуда: СПб
Сообщений: 15666
а обязательно одним селектом надо?
просто первое, что на ум приходит - добавить куда-нибудь столбец со значением Count(*) таблицы, тогда в следующем запросе уже можно было бы сгруппировать с одним having(count(*)) = max(столбец)
2 фев 12, 19:12    [12022069]     Ответить | Цитировать Сообщить модератору
 Re: Соеденене по наборам  [new]
Дис
Member

Откуда: Таганрог
Сообщений: 21
grinya,

да нет не обязательно одним, count можно и пред посчитать, но я не вижу решения с count, так как для count=2 мы имеем 3 разных результата (id 2,3 и 4,), тоже самое и для count=1 тоже три :)
2 фев 12, 19:16    [12022088]     Ответить | Цитировать Сообщить модератору
 Re: Соеденене по наборам  [new]
count(*) = count(*)
Guest
select *
from (
select t1.id
from (
select t.id, cnt = count(*)
from [1st table] t
group by t.id
having count(*) = (select count(*) from [2st table])
) a
inner join [1st table] t1 on a.id = t1.id
inner join [2st table] t2 on t1.TicketID = t2.TicketID
group by t1.id, cnt
having cnt = count(*)
) a
cross join [2st table]
2 фев 12, 19:26    [12022123]     Ответить | Цитировать Сообщить модератору
 Re: Соеденене по наборам  [new]
qwerty112
Guest
Дис,

запрос реляционное деление

+
declare @t1 table (ID int,TicketID int)

insert into @t1

select 1,10 union all
select 1,11 union all
select 1,12 union all
select 2,10 union all
select 2,11 union all
select 3,10 union all
select 3,12 union all
select 4,11 union all
select 4,12 union all
select 5,10 union all
select 6,11 union all
select 7,12

declare @t2 table (TicketID int)

insert into @t2

select 10 union all
select 11 union all
select 12

SELECT  ID, TicketID
  FROM @t1  AS P1
  
 WHERE 
	(select count(*) from
       (SELECT TicketID
          FROM @t1 AS P2 
         WHERE P1.ID = P2.ID
        EXCEPT 
        SELECT TicketID
          FROM @t2)a) = 0
and
          
	(select count(*) from
       (SELECT TicketID
          FROM @t2
        EXCEPT 
        SELECT TicketID
          FROM @t1  AS P2 
         WHERE P1.ID = P2.ID)a) = 0
2 фев 12, 19:34    [12022151]     Ответить | Цитировать Сообщить модератору
 Re: Соеденене по наборам  [new]
Дис
Member

Откуда: Таганрог
Сообщений: 21
qwerty112,
спасибо огромное, особенно за название
3 фев 12, 10:11    [12024074]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить