-
Помогите, пожалуйста, решить задачку:
CREATE TABLE T([P] [int] IDENTITY(1,1) NOT NULL)
CREATE TABLE T1([P1] [int] IDENTITY(1,1) NOT NULL,
[PT] [int] NOT NULL)
CREATE TABLE T2([P2] [int] IDENTITY(1,1) NOT NULL,
[PT] [int] NOT NULL)
Все P-ключи, РТ-внешние ключи к таблице Т.
Нужно получить все записи из Т и соответствующие им из Т1 и Т2 в таком виде:
Р Р1 Р2
1 111 211
1 112 NULL
1 113 NULL
2 NULL 221
2 NULL 222
3 NULL NULL
4 141 241
То есть нужно, чтобы данные из Т1 и Т2 не объединялись, а пересекались по полю РТ
-
select T.P, T1.P1, T2.P2 from
T
Left join T1 on T1.PT=T.P
Left join T2 on T2.PT=T.P
Как*то так...
-
нет нет. это как раз и получается объединение.
Мне не важно сделать это одним запросом, может быть как-то через процедуры или через несколько вьюшек
-
Тогда не понял вопроса, покажите как эти данные выглядят в таблицах
-
P
1
2
3
4
P1 PT
111 1
112 1
113 1
141 4
P2 PT
211 1
221 2
222 2
241 4
-
тот запрос вернет такой результат как нужно
-
А нужно чтобы если в табл 2 1 запись чтобы она не дублировалась?
-
> А нужно чтобы если в табл 2 1 запись чтобы она не дублировалась?
да, да. В том-то и дело. Одним запросом это не сделать. Но никак не могу придумать ни процедуру, ни комбинацию вьюшек.
Может как-то ввести искуственный ключь в Т1 и Т2, чтобы по нему их соединить?...
-
а кокой критерий того что 211 должна быть именно с 111 а не с 112 или 113? что-то тут не то
-
> а кокой критерий того что 211 должна быть именно с 111 а
> не с 112 или 113? что-то тут не то
в этом плане нет критериев, это не важно. Просто нужно чтобы для Р выдавалось максимальное число строк из Т1 или Т2, но не сумма Т1 и Т2
-
-
как-то так
select P, NULL as P1, P2 into #R from T left join t2 on t2.PT=t.P
update #R set P1 = t1.P1 from #R join T1 on t1.PT=#R.P
insert into #r
select PT, t1.P1, NULL AS P2
from t1 where P1 not in (select P1 from #R where #R.P=T1.PT)
select * from #R
drop table #R
?
возможно можно еще более проще ...
-
хотя наверное тоже не то. :)
-
> nikefest (16.03.12 13:35)
Вы сами сначала определитесь, какие именно записи надо выдавать из T1 и T2.
Например.
T1 - записи абырвалг11 и абырвалг12
T2 - записи абырвалг21, абырвалг22 и абырвалг23
Какие из них интересуют? Где критерий?
-
>знайка (16.03.12 19:29) [11]
можно без ахинеи?)
автор сам изрядно не в курсе, чего хочет
не увеличивайте энтропию)
-
тут сам собой напрашивается ОВСФ
-
Ну уж я не знаю как еще объяснить что нужно. Т1 и Т2 между собой не связаны никак. Только через таблицу Т. Вот Знайка скорее всего меня понял, попробую его вариант под номером 11
-
> [16] nikefest (19.03.12 14:32)
> Т1 и Т2 между собой не связаны никак. Только через таблицу Т.
Значит заполняешь Т1 и Т2, потом заполняешь их связь в Т.
-
>nikefest (19.03.12 14:32) [16]
ок.
почему в выборке есть:
Р Р1 Р2
1 111 211
но нет:
Р Р1 Р2
1 112 211
1 113 211
?
-
> почему в выборке есть:
> Р Р1 Р2
> 1 111 211
>
> но нет:
> Р Р1 Р2
> 1 112 211
> 1 113 211
ну вот пример попроще: Есть таблица футбольных команд Ф, и две таблицы игроков которые пришли в команду ИП и таблица игроков которые ушли из команды ИУ. Естественно что ИП и ИУ связаны между собой только через таблицу Ф. И вот из команды "Дуболомы" ушли Сидоров и Дубов, а пришел Травкин. Нужно вывести эти данные в таком виде:
Команда Ушли Пришли
"Дуболомы" Сидоров Травкин
"Дуболомы" Дубов Null
Так понятнее может быть будет