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

Откуда:
Сообщений: 8
Всем привет, есть надеюсь несложный для знатоков вопрос:

CREATE TABLE t1 (
[KeyID1] [int] NOT NULL,
[KeyID2] [int] NOT NULL,
[Date] [datetime] NOT NULL,
[Value1] [int] NULL,
CONSTRAINT [PK_t1] PRIMARY KEY CLUSTERED
(
[KeyID1] ASC,
[KeyID2] ASC,
[Date] ASC
))

CREATE TABLE t2 (
[KeyID1] [int] NOT NULL,
[KeyID2] [int] NOT NULL,
[Date] [datetime] NOT NULL,
[Value2] [int] NULL,
CONSTRAINT [PK_t2] PRIMARY KEY CLUSTERED
(
[KeyID1] ASC,
[KeyID2] ASC,
[Date] ASC
))

CREATE TABLE t1 (
[KeyID1] [int] NOT NULL,
[KeyID2] [int] NOT NULL,
[Date] [datetime] NOT NULL,
[Value3] [int] NULL,
CONSTRAINT [PK_t3] PRIMARY KEY CLUSTERED
(
[KeyID1] ASC,
[KeyID2] ASC,
[Date] ASC
))

Непосредственно между собой таблицы не связаны.
Хотелось бы одним запросом получить следующий результат:
KeyID1 | KeyID2 | Date | Value1 | Value2 | Value3
1 |
14 авг 09, 13:02    [7538873]     Ответить | Цитировать Сообщить модератору
 Re: SQL: нетривиальный join нескольких таблиц  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36803
И чего же нетривиального в этом join'е?
14 авг 09, 13:04    [7538895]     Ответить | Цитировать Сообщить модератору
 Re: SQL: нетривиальный join нескольких таблиц  [new]
Glory
Member

Откуда:
Сообщений: 104760
Этот нетривиальный join называется UNION
14 авг 09, 13:05    [7538906]     Ответить | Цитировать Сообщить модератору
 Re: SQL: нетривиальный join нескольких таблиц  [new]
salefun
Member

Откуда:
Сообщений: 8
CREATE TABLE t1 (
[KeyID1] [int] NOT NULL,
[KeyID2] [int] NOT NULL,
[Date] [datetime] NOT NULL,
[Value1] [int] NULL,
CONSTRAINT [PK_t1] PRIMARY KEY CLUSTERED
(
[KeyID1] ASC,
[KeyID2] ASC,
[Date] ASC
))

CREATE TABLE t2 (
[KeyID1] [int] NOT NULL,
[KeyID2] [int] NOT NULL,
[Date] [datetime] NOT NULL,
[Value2] [int] NULL,
CONSTRAINT [PK_t2] PRIMARY KEY CLUSTERED
(
[KeyID1] ASC,
[KeyID2] ASC,
[Date] ASC
))

CREATE TABLE t1 (
[KeyID1] [int] NOT NULL,
[KeyID2] [int] NOT NULL,
[Date] [datetime] NOT NULL,
[Value3] [int] NULL,
CONSTRAINT [PK_t3] PRIMARY KEY CLUSTERED
(
[KeyID1] ASC,
[KeyID2] ASC,
[Date] ASC
))

Непосредственно между собой таблицы не связаны.
Хотелось бы одним запросом получить следующий результат:
KeyID1 | KeyID2 | Date | Value1 | Value2 | Value3

Причем результат должен содержать такое:
1 1 1 NULL NULL ###
1 2 1 NULL ### NULL
2 2 1 ### NULL NULL
4 2 1 NULL ### ###
и т.д.
т.е. составной ключ всегда присутствует, но какие-то значения могут содержать NULL.

Основная проблема в том, что ключи могу брать только из одной таблицы, тогда как в других таблицах могут быть другие ключи с другими значениями. В этом случае нужно получить NULL в значениях первой таблицы, но записи из другой должны присутствовать в результате.

Пока есть на уме только вариант соединять каждую с каждой left join-ом и c помощью union потом склеивать результаты, но этот вариант очень трудоемок и, на мой взгляд, не эффективен.
14 авг 09, 13:08    [7538924]     Ответить | Цитировать Сообщить модератору
 Re: SQL: нетривиальный join нескольких таблиц  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36803
full outer join называется ваш join.
14 авг 09, 13:08    [7538930]     Ответить | Цитировать Сообщить модератору
 Re: SQL: нетривиальный join нескольких таблиц  [new]
salefun
Member

Откуда:
Сообщений: 8
Гавриленко Сергей Алексеевич,

Glory,

криво написал первое сообщение, соскочил палец )
14 авг 09, 13:09    [7538940]     Ответить | Цитировать Сообщить модератору
 Re: SQL: нетривиальный join нескольких таблиц  [new]
salefun
Member

Откуда:
Сообщений: 8
Гавриленко Сергей Алексеевич,

full outer join вряд ли мне поможет, так как результат будет следующий

KeyID1 | KeyID2 | Date | Value1 | Value2 | Value3
1 1 1 ### NULL NULL
1 1 1 ### NULL NULL
1 1 1 ### NULL NULL
NULL NULL NULL NULL ### NULL

в 4-й строке нет ключей
14 авг 09, 13:11    [7538959]     Ответить | Цитировать Сообщить модератору
 Re: SQL: нетривиальный join нескольких таблиц  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
1.
select isnull(tt.id1,t3.id1)... from (select isnull(t1.id1,t2.id1)... from t1 full join t2) tt full join t3
2.
select id1, id2, dat, max(value1), max(value2), max(value3) from (select id1, id2, dat, value1, null, null from t1
     union all
     select id1, id2, dat, null, value2, null from t2
     union all
     select id1, id2, dat, null, null, value3 from t3) tt
  group by id1, id2, dat

для спящего время бодрствования равносильно сну
14 авг 09, 13:12    [7538961]     Ответить | Цитировать Сообщить модератору
 Re: SQL: нетривиальный join нескольких таблиц  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36803
Значит right/left.
14 авг 09, 13:12    [7538968]     Ответить | Цитировать Сообщить модератору
 Re: SQL: нетривиальный join нескольких таблиц  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
salefun
Гавриленко Сергей Алексеевич,

full outer join вряд ли мне поможет, так как результат будет следующий

KeyID1 | KeyID2 | Date | Value1 | Value2 | Value3
1 1 1 ### NULL NULL
1 1 1 ### NULL NULL
1 1 1 ### NULL NULL
NULL NULL NULL NULL ### NULL

в 4-й строке нет ключей

это наверна потому что вы их туда поставили. вот и NULL в 4ой строке.
14 авг 09, 13:13    [7538972]     Ответить | Цитировать Сообщить модератору
 Re: SQL: нетривиальный join нескольких таблиц  [new]
salefun
Member

Откуда:
Сообщений: 8
Алексей2003,

спасибо, буду пробовать.

почему вы так решили ? запрос

select t1.keyID1, t1.keyID2, t1.Date, t1.Value1, t2.Value2
from t1
full outer join
t2 on (t1.keyID1 = t2.keyID1 and t1.keyID2 = t2.keyID2 and t1.Date = t2.Date)
from db
как раз выводит то, что я писал выше, т.е. если в первой таблице нет таких значений составного ключа, то выводится только Value2 без ключей. Не, я могу конечно дописать в селекте t2.keyID1 ... но куда потом эти "дополнительные" столбцы ?
14 авг 09, 13:19    [7539025]     Ответить | Цитировать Сообщить модератору
 Re: SQL: нетривиальный join нескольких таблиц  [new]
Glory
Member

Откуда:
Сообщений: 104760
salefun
Алексей2003,

спасибо, буду пробовать.

почему вы так решили ? запрос

select t1.keyID1, t1.keyID2, t1.Date, t1.Value1, t2.Value2
from t1
full outer join
t2 on (t1.keyID1 = t2.keyID1 and t1.keyID2 = t2.keyID2 and t1.Date = t2.Date)
from db
как раз выводит то, что я писал выше, т.е. если в первой таблице нет таких значений составного ключа, то выводится только Value2 без ключей. Не, я могу конечно дописать в селекте t2.keyID1 ... но куда потом эти "дополнительные" столбцы ?

А isnull(t1.id1,t2.id1) кто мешает написать ?
14 авг 09, 13:20    [7539033]     Ответить | Цитировать Сообщить модератору
 Re: SQL: нетривиальный join нескольких таблиц  [new]
salefun
Member

Откуда:
Сообщений: 8
никто не мешает, спасибо за совет!
14 авг 09, 14:53    [7539935]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить