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

Откуда: Москва->Петушки
Сообщений: 8258
Есть две таблицы допустим по одной колонке в каждой произвольного типа.
Надо сделать выборку из этих двух таблиц, так чтобы в выборке было две колонки
первая из первой таблицы вторая из второй. Пары могут быть составлены произвольным образом.
Но каждая запись из каждой таблицы должна встречаться один и только один раз.

Microsoft SQL Server 2008 R2 (RTM) - 10.50.1765.0 (Intel X86) Feb 2 2011 18:45:52 Copyright (c) Microsoft Corporation Developer Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 3, v.3264)
30 июн 11, 15:17    [10900332]     Ответить | Цитировать Сообщить модератору
 Re: Соединить две таблицы произвольным образом  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

ну так, по row_number() объединить
;with t as (select name, row_number() over (order by name) rn from sys.tables)
, p as (select name, row_number() over (order by name) rn from sys.procedures)
select *
from t full outer join p on t.rn = p.rn
для повторяемости результата order by надо делать по уникальному столбцу или набору столбцов.

Posted via ActualForum NNTP Server 1.4

30 июн 11, 15:24    [10900445]     Ответить | Цитировать Сообщить модератору
 Re: Соединить две таблицы произвольным образом  [new]
uaggster
Member

Откуда:
Сообщений: 1064
Select a.f1, b.f2 from Table1 a cross join Table2 b

Или

Select a.f1, b.f2 from Table1 a, Table2 b
на старом добром SQL89

f1, f2 - имена нужных столбцов
2 июл 11, 20:12    [10911933]     Ответить | Цитировать Сообщить модератору
 Re: Соединить две таблицы произвольным образом  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
uaggster
Select a.f1, b.f2 from Table1 a cross join Table2 b

Или

Select a.f1, b.f2 from Table1 a, Table2 b
на старом добром SQL89

f1, f2 - имена нужных столбцов
А как же быть с этим:
.NET
каждая запись из каждой таблицы должна встречаться один и только один раз
?
Не выходит у Вас каменный цветок!
2 июл 11, 20:16    [10911945]     Ответить | Цитировать Сообщить модератору
 Re: Соединить две таблицы произвольным образом  [new]
uaggster
Member

Откуда:
Сообщений: 1064
.NET, прошу прощения, протупил. Не до конца прочитал условие.

Теперь прочитал до конца :-). Вопрос: в обеих таблицах равное число строк, да? Иначе задача нерешаема в принципе!
2 июл 11, 20:16    [10911947]     Ответить | Цитировать Сообщить модератору
 Re: Соединить две таблицы произвольным образом  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8877
Вот так:
;with t as (select name, row_number() over (order by name) rn from sys.tables)
, p as (select name, row_number() over (order by name) rn from sys.procedures)
select *
from t full outer join p on t.rn = p.rn

получаем:
namernnamern
MSreplication_options1sp_MScleanupmergepublisher1
spt_fallback_db2sp_MSrepl_startup2
spt_fallback_dev3NULLNULL
spt_values6NULLNULL
spt_fallback_usg4NULLNULL
spt_monitor5NULLNULL


------------------
или вот так (наведём немного марафету):
;with t as (select n1=name, row_number() over (order by name) rn from sys.tables)
, p as (select n2=name, row_number() over (order by name) rn from sys.procedures)
select *
from t full outer join p on t.rn = p.rn
where n1 is not null and n2 is not null
получаем:
n1rnn2rn
MSreplication_options1sp_MScleanupmergepublisher1
spt_fallback_db2sp_MSrepl_startup2
3 июл 11, 03:47    [10913197]     Ответить | Цитировать Сообщить модератору
 Re: Соединить две таблицы произвольным образом  [new]
Evgen
Member

Откуда: Екатеринбург
Сообщений: 91
SIMPLicity_

;with t as (select n1=name, row_number() over (order by name) rn from sys.tables)
, p as (select n2=name, row_number() over (order by name) rn from sys.procedures)
select *
from t full outer join p on t.rn = p.rn
where n1 is not null and n2 is not null
получаем:
n1rnn2rn
MSreplication_options1sp_MScleanupmergepublisher1
spt_fallback_db2sp_MSrepl_startup2


Зачем такие извращения, достаточно
;with t as (select n1=name, row_number() over (order by name) rn from sys.tables)
, p as (select n2=name, row_number() over (order by name) rn from sys.procedures)
select *
from t inner join p on t.rn = p.rn
3 июл 11, 12:28    [10913518]     Ответить | Цитировать Сообщить модератору
 Re: Соединить две таблицы произвольным образом  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Evgen
Зачем такие извращения, достаточно
;with t as (select n1=name, row_number() over (order by name) rn from sys.tables)
, p as (select n2=name, row_number() over (order by name) rn from sys.procedures)
select *
from t inner join p on t.rn = p.rn
Ай-яй-яй!
10900445
3 июл 11, 13:49    [10913633]     Ответить | Цитировать Сообщить модератору
 Re: Соединить две таблицы произвольным образом  [new]
Evgen
Member

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

мой пост относился к куску кода SIMPLicity_, а именно к
from t full outer join p on t.rn = p.rn
where n1 is not null and n2 is not null

что я и предложил заменить на более простое и понятное
from t inner join p on t.rn = p.rn
3 июл 11, 18:37    [10914128]     Ответить | Цитировать Сообщить модератору
 Re: Соединить две таблицы произвольным образом  [new]
.NET
Member

Откуда: Москва->Петушки
Сообщений: 8258
uaggster
.NET, прошу прощения, протупил. Не до конца прочитал условие.

Теперь прочитал до конца :-). Вопрос: в обеих таблицах равное число строк, да? Иначе задача нерешаема в принципе!


Можно считать что одинаковое число строк.
Но в принципе можно расширить на неодинаковое число строк,
а недостающие поля забить NULL.

daw, iap, SIMPLicity_, Evgen

Спасибо
11 июл 11, 11:53    [10954776]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить