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

Есть таблица:
Declare @tbl1 table (fld1 varchar(50), fld2 varchar(50),  fld3 numeric)

INSERT INTO @tbl1 
SELECT 
'a','aa',1
union all
SELECT 
'a','bb',1
union all
SELECT 
'b','aa',1
union all
SELECT 
'b','cc',1
union all
SELECT 
'c','dd',1


И вот таким вот запросом:
select q.fld1, q.fld2, tbl1.fld3 FROM @tbl1 tbl1
right join
(SeLECT * from
(select distinct fld2 from @tbl1) as q1
Cross join 
(select distinct fld1 from @tbl1) as q2
) as q
on tbl1.fld1 = q.fld1 and tbl1.fld2 = q.fld2


Я получаю такой результат:
'a''aa'1
'a''bb'1
'a''cc'null
'a''dd'null
'b''aa'1
'b''bb'null
'b''cc'1
'b''dd'null
'c''aa'null
'c''bb'null
'c''cc'null
'c''dd'1

То есть каждому значению поля fld1 должны соответствовать все существующие значения поля fld2.
Но мне не особо нравится такая конструкция, так как @tbl1 в реале будет запрос.
Можно ли добиться того же результата как-то более элегантно?
29 дек 14, 16:09    [17068335]     Ответить | Цитировать Сообщить модератору
 Re: cross join по двум полям одной таблицы  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
SELECT T1.fld1, T2.fld2, T1.fld3
FROM @t1 T1 JOIN @t1 T2 ON T1.fld1=T2.fld1;
??
29 дек 14, 16:24    [17068413]     Ответить | Цитировать Сообщить модератору
 Re: cross join по двум полям одной таблицы  [new]
Glory
Member

Откуда:
Сообщений: 104751
юзерь958
Но мне не особо нравится такая конструкция, так как @tbl1 в реале будет запрос.
Можно ли добиться того же результата как-то более элегантно?

Сразу написать этот "запрос в реале" как нужно ?
29 дек 14, 16:26    [17068423]     Ответить | Цитировать Сообщить модератору
 Re: cross join по двум полям одной таблицы  [new]
юзерь958
Guest
iap
SELECT T1.fld1, T2.fld2, T1.fld3
FROM @t1 T1 JOIN @t1 T2 ON T1.fld1=T2.fld1;
??


нет, это не то...
29 дек 14, 16:34    [17068454]     Ответить | Цитировать Сообщить модератору
 Re: cross join по двум полям одной таблицы  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
юзерь958
iap
SELECT T1.fld1, T2.fld2, T1.fld3
FROM @t1 T1 JOIN @t1 T2 ON T1.fld1=T2.fld1;

??


нет, это не то...
Это всё, что можете сказать?
29 дек 14, 16:35    [17068463]     Ответить | Цитировать Сообщить модератору
 Re: cross join по двум полям одной таблицы  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8815
юзерь958,

сделайте предвыборку во временную таблицу, какая разница.
29 дек 14, 16:36    [17068468]     Ответить | Цитировать Сообщить модератору
 Re: cross join по двум полям одной таблицы  [new]
юзерь958
Guest
iap
юзерь958
пропущено...


нет, это не то...
Это всё, что можете сказать?


результат совсем не такой как надо получается, ...
29 дек 14, 16:40    [17068497]     Ответить | Цитировать Сообщить модератору
 Re: cross join по двум полям одной таблицы  [new]
юзерь958
Guest
Glory
юзерь958
Но мне не особо нравится такая конструкция, так как @tbl1 в реале будет запрос.
Можно ли добиться того же результата как-то более элегантно?

Сразу написать этот "запрос в реале" как нужно ?


да вроде как нельзя ...., там целая цепочка запросов вьюшек,... отобрать все уникальные значение только на этом этапе получается.
29 дек 14, 16:48    [17068530]     Ответить | Цитировать Сообщить модератору
 Re: cross join по двум полям одной таблицы  [new]
юзерь958
Guest
Владислав Колосов
юзерь958,

сделайте предвыборку во временную таблицу, какая разница.

хочу результат сохранить как вьюшку
29 дек 14, 16:52    [17068554]     Ответить | Цитировать Сообщить модератору
 Re: cross join по двум полям одной таблицы  [new]
Glory
Member

Откуда:
Сообщений: 104751
юзерь958
да вроде как нельзя

Да ладно

юзерь958
там целая цепочка запросов вьюшек,... отобрать все уникальные значение только на этом этапе получается.

Вы хотите сказать, что нельзя сделать cross join оригинальным таблицам так же, как вы сделали это в свеом примере ?
29 дек 14, 16:55    [17068573]     Ответить | Цитировать Сообщить модератору
 Re: cross join по двум полям одной таблицы  [new]
юзерь958
Guest
Glory
юзерь958
да вроде как нельзя

Да ладно

юзерь958
там целая цепочка запросов вьюшек,... отобрать все уникальные значение только на этом этапе получается.

Вы хотите сказать, что нельзя сделать cross join оригинальным таблицам так же, как вы сделали это в свеом примере ?


нет, сделать так, конечно, можно, но будет ли это лучше ? оригинальных таблиц шесть
29 дек 14, 17:04    [17068649]     Ответить | Цитировать Сообщить модератору
 Re: cross join по двум полям одной таблицы  [new]
Glory
Member

Откуда:
Сообщений: 104751
юзерь958
нет, сделать так, конечно, можно, но будет ли это лучше ?

Это будет лучше cross join-а конечного запроса с самим собой

юзерь958
оригинальных таблиц шесть

Вам нужны только та одна(может две), в которых есть fld1 и fld2
29 дек 14, 17:07    [17068681]     Ответить | Цитировать Сообщить модератору
 Re: cross join по двум полям одной таблицы  [new]
юзерь958
Guest
юзерь958
оригинальных таблиц шесть

Вам нужны только та одна(может две), в которых есть fld1 и fld2


как раз в 5 из 6 эти два поля присутствуют, а в 6 только одно
29 дек 14, 17:10    [17068707]     Ответить | Цитировать Сообщить модератору
 Re: cross join по двум полям одной таблицы  [new]
Glory
Member

Откуда:
Сообщений: 104751
юзерь958
как раз в 5 из 6 эти два поля присутствуют, а в 6 только одно

Мда. И что мешает выбрать одну из таблиц для получения всех комбинаций ?
29 дек 14, 17:13    [17068726]     Ответить | Цитировать Сообщить модератору
 Re: cross join по двум полям одной таблицы  [new]
юзерь958
Guest
Glory
юзерь958
как раз в 5 из 6 эти два поля присутствуют, а в 6 только одно

Мда. И что мешает выбрать одну из таблиц для получения всех комбинаций ?


то, что в одной таблице все комбинации могут не получиться, точнее точно не получаться...
можно перемножить два справочника с этими полями, но тогда будет излишок
29 дек 14, 17:18    [17068764]     Ответить | Цитировать Сообщить модератору
 Re: cross join по двум полям одной таблицы  [new]
Glory
Member

Откуда:
Сообщений: 104751
юзерь958
то, что в одной таблице все комбинации могут не получиться, точнее точно не получаться...

Откуда тогда эти комбинации получаются в вашем текущем запросе ?
29 дек 14, 17:21    [17068780]     Ответить | Цитировать Сообщить модератору
 Re: cross join по двум полям одной таблицы  [new]
юзерь958
Guest
Glory
юзерь958
то, что в одной таблице все комбинации могут не получиться, точнее точно не получаться...

Откуда тогда эти комбинации получаются в вашем текущем запросе ?


из результата соединения 5 таблиц
29 дек 14, 17:25    [17068802]     Ответить | Цитировать Сообщить модератору
 Re: cross join по двум полям одной таблицы  [new]
юзерь958
Guest
юзерь958
Glory
пропущено...

Откуда тогда эти комбинации получаются в вашем текущем запросе ?


из результата соединения 5 таблиц


объединения
29 дек 14, 17:26    [17068806]     Ответить | Цитировать Сообщить модератору
 Re: cross join по двум полям одной таблицы  [new]
Glory
Member

Откуда:
Сообщений: 104751
юзерь958
юзерь958
пропущено...


из результата соединения 5 таблиц


объединения

как все запущенно
Вы хотите сказать, что у вас там UNION пяти таблиц ?
29 дек 14, 17:31    [17068840]     Ответить | Цитировать Сообщить модератору
 Re: cross join по двум полям одной таблицы  [new]
юзерь958
Guest
Glory
юзерь958
пропущено...


объединения

как все запущенно
Вы хотите сказать, что у вас там UNION пяти таблиц ?


да
29 дек 14, 17:36    [17068859]     Ответить | Цитировать Сообщить модератору
 Re: cross join по двум полям одной таблицы  [new]
Glory
Member

Откуда:
Сообщений: 104751
юзерь958
Glory
пропущено...

как все запущенно
Вы хотите сказать, что у вас там UNION пяти таблиц ?


да

тогда так 17068468
29 дек 14, 17:38    [17068864]     Ответить | Цитировать Сообщить модератору
 Re: cross join по двум полям одной таблицы  [new]
юзерь958
Guest
Glory
юзерь958
пропущено...


объединения

как все запущенно
Вы хотите сказать, что у вас там UNION пяти таблиц ?


я так понял, что union-ам есть более выгодная альтернатива
29 дек 14, 17:42    [17068875]     Ответить | Цитировать Сообщить модератору
 Re: cross join по двум полям одной таблицы  [new]
юзерь958
Guest
Glory
пропущено...

как все запущенно
Вы хотите сказать, что у вас там UNION пяти таблиц ?


я так понял, что union-ам есть более выгодная альтернатива
...забыл добавить знаки "???"
29 дек 14, 17:46    [17068887]     Ответить | Цитировать Сообщить модератору
 Re: cross join по двум полям одной таблицы  [new]
Добрый Э - Эх
Guest
юзерь958,

то, что ты хочешь, в ANSI-SQL зовется секционированным соединением таблиц (partition join). Не уверен, что скульсервер такое поддерживает. Но в некоторых СУБД запрос бы был весьма себе элементарным. :)
29 дек 14, 17:48    [17068898]     Ответить | Цитировать Сообщить модератору
 Re: cross join по двум полям одной таблицы  [new]
юзерь958
Guest
Добрый Э - Эх
юзерь958,

то, что ты хочешь, в ANSI-SQL зовется секционированным соединением таблиц (partition join). Не уверен, что скульсервер такое поддерживает. Но в некоторых СУБД запрос бы был весьма себе элементарным. :)

спасибо, за формализацию , сейчас погуглю partition join на ms sql
29 дек 14, 17:53    [17068916]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить