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

Откуда:
Сообщений: 48
Доброго всем дня!
Есть 2 таблицы вида:

create table dbo.Rasp
(
ID int NOT NULL -- Просто ID-шник
, WD smallint NOT NULL -- Дни недели
, FIO varchar(50) -- ФИО человека
)

create table dbo.WeekDays
(
ID int NOT NULL -- ID дня недели
, WD_Name varchar(15) -- Название дня недели
)

Надо:
вывести полный список ФИО и для каждого ФИО все дни недели, т.е. например:
Иванов И. И. 1
Иванов И. И. 2
Иванов И. И. 3
Иванов И. И. 4
Иванов И. И. 5
Иванов И. И. 6
Иванов И. И. 7
Петров П. П, 1
Петров П. П., 2
Петров П. П., 3

Есть пока только вариант, кажущийся мне плохоньким.
select r.FIO
, r.WD
, w.WD_Name
from rasp r
inner join weekdays w
on r.WD = w.ID
UNION
select r.FIO
, w.ID
, w.WD_Name
from weekdays w
left join rasp r
on w.ID <> r.WD

Можно ли реализовать с помощью CTE?
17 авг 16, 02:14    [19550385]     Ответить | Цитировать Сообщить модератору
 Re: Объединить таблицы  [new]
3unknown
Member

Откуда: New York
Сообщений: 140
select r.FIO,w.id,WD_name
from (select distinct FIO from dbo.Rasp) r cross apply dbo.WeekDays w
17 авг 16, 03:16    [19550395]     Ответить | Цитировать Сообщить модератору
 Re: Объединить таблицы  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
3unknown
select r.FIO,w.id,WD_name
from (select distinct FIO from dbo.Rasp) r cross apply dbo.WeekDays w
Джойноненавистник?
17 авг 16, 08:52    [19550599]     Ответить | Цитировать Сообщить модератору
 Re: Объединить таблицы  [new]
o-o
Guest
любитель кросса )))
17 авг 16, 09:10    [19550657]     Ответить | Цитировать Сообщить модератору
 Re: Объединить таблицы  [new]
JustNick
Member

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

а разве можно эту задач решить джойном? надо, чтобы были значения ФИО во всех строках. А они будут нулевыми при джойнах. Так что cross apply - действительно выход. Но как-то думаю, что можно это рекурсией решить. Однако никак не приходит в голову само решение...
17 авг 16, 12:15    [19551517]     Ответить | Цитировать Сообщить модератору
 Re: Объединить таблицы  [new]
JustNick
Member

Откуда:
Сообщений: 48
3unknown, спасибо :)
17 авг 16, 12:15    [19551519]     Ответить | Цитировать Сообщить модератору
 Re: Объединить таблицы  [new]
o-o
Guest
JustNick
а разве можно эту задач решить джойном? надо, чтобы были значения ФИО во всех строках. А они будут нулевыми при джойнах.

CROSS JOIN никогда не видели?
со времен динозавров существует
declare @t table(fio varchar(100));
insert into @t select 'Petrov';

declare @d table(dd int);
insert into @d values(1), (2), (3), (4), (5), (6), (7);

select *
from @t cross JOIN @d;
17 авг 16, 13:07    [19551857]     Ответить | Цитировать Сообщить модератору
 Re: Объединить таблицы  [new]
JustNick
Member

Откуда:
Сообщений: 48
o-o,

а в чем разница работы cross join и cross apply?
По результатам запросов разницы нет...
17 авг 16, 13:47    [19552133]     Ответить | Цитировать Сообщить модератору
 Re: Объединить таблицы  [new]
Pavel1211
Member

Откуда: Екатеринбург
Сообщений: 205
JustNick,

это смотря какой запрос.

Вообще cross join - декартово произведение
17 авг 16, 13:49    [19552149]     Ответить | Цитировать Сообщить модератору
 Re: Объединить таблицы  [new]
o-o
Guest
вообще-то APPLY на коррелирование намекает,
иначе зачем бы вторую аналогичную кросс джойну конструкцию вводить.
но вы ж сами пишете, у вас одно от другого не зависит,
вам надо все возможные комбинации, т.е. декартово произведение.
алгебру в школе прогуливали?
17 авг 16, 14:03    [19552247]     Ответить | Цитировать Сообщить модератору
 Re: Объединить таблицы  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
o-o
вообще-то APPLY на коррелирование намекает,
иначе зачем бы вторую аналогичную кросс джойну конструкцию вводить.
но вы ж сами пишете, у вас одно от другого не зависит,
вам надо все возможные комбинации, т.е. декартово произведение.
алгебру в школе прогуливали?

но по факту запросы(APPLY vs CROSS JOIN) не будут отличатся ничем при отсутствии этой самой корреляции
17 авг 16, 14:16    [19552319]     Ответить | Цитировать Сообщить модератору
 Re: Объединить таблицы  [new]
o-o
Guest
TaPaK
o-o
вообще-то APPLY на коррелирование намекает,
иначе зачем бы вторую аналогичную кросс джойну конструкцию вводить.
но вы ж сами пишете, у вас одно от другого не зависит,
вам надо все возможные комбинации, т.е. декартово произведение.
алгебру в школе прогуливали?

но по факту запросы(APPLY vs CROSS JOIN) не будут отличатся ничем при отсутствии этой самой корреляции

по факту и полное внешнее соединение при отсутствии внешних строк
будет выдавать то же самое, что и внутреннее.
и что из этого?
17 авг 16, 14:45    [19552464]     Ответить | Цитировать Сообщить модератору
 Re: Объединить таблицы  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
o-o,

автор
и что из этого?

всё тлен
17 авг 16, 14:46    [19552470]     Ответить | Цитировать Сообщить модератору
 Re: Объединить таблицы  [new]
o-o
Guest
TaPaK
o-o,

автор
и что из этого?

всё тлен

все кросс
17 авг 16, 14:49    [19552480]     Ответить | Цитировать Сообщить модератору
 Re: Объединить таблицы  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8807
Cross Apply означает "применить указанное выражение к каждой строке запроса и добавить результат выражения к каждой строке запроса". Apply - применение.
17 авг 16, 15:09    [19552599]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить