Имя: Пароль:
1C
1С v8
Соединение трех таблиц
0 5 Элемент
 
06.04.12
18:12
Есть три связанные таблицы http://screencast.com/t/kQhry8iN2L1
Поля A,B уникальные, С - нет.
Необходимо выбрать записи из Т3 и получить соответствующие записи из Т2.
Как сделать?

Я делаю так, но не знаю правильно или нет
Т3 КАК Т3
  ЛЕВОЕ СОЕДИНЕНИЕ Т1 КАК Т1
     ВНУТРЕННЕЕ СОЕДИНЕНИЕ T2 КАК T2
     ПО (T2.B = T1.B)
  ПО (Т1.A = T3.A)
     И (T2.B = T1.B)
1 rs_trade
 
06.04.12
18:15
(0) два левых джойна?
2 5 Элемент
 
06.04.12
18:19
Забыл, в Т2 значение поля В может повторятся.
В Т1 значение поля В не повторяется.
3 mr_K
 
06.04.12
18:23
(2) Для каждого поля В из T1 нужно выбрать одну запись из Т2 или нет. Если да, то какую брать?
4 mr_K
 
06.04.12
18:24
и последняя строчка в условиях последнего соединения явно лишняя.
5 5 Элемент
 
06.04.12
18:25
(3) нужно для каждой строки из Т3 получить одну строку из Т2
6 5 Элемент
 
06.04.12
18:30
Т1:
А | В
------
1 | 1
2 | 2
3 | 3

Т2:
В | С
------
1 | 1
2 | 1
3 | 1

Т3:
А | C
------
1 | 1
2 | 1
3 | 1

Нужно получить:
А | В | C
-----------
1 | 1 | 1
2 | 2 | 1
3 | 3 | 1
7 5 Элемент
 
06.04.12
18:33
(4) последней строкой я ограничиваю выборку из Т2, т.к. вторым соединением можно получить несколько строк
8 rs_trade
 
06.04.12
18:45
declare @t1 table (A int, B int)
insert @t1 values (1, 1), (2, 2), (3, 3)

declare @t2 table (B int, C int)
insert @t2 values (1, 1), (2, 1), (3, 1)

declare @t3 table (A int, C int)
insert @t3 values (1, 1), (2, 1), (3, 1)


select
   t3.A,
   t1.B,
   t2.C
   
from
   @t1 as t1
   inner join
   @t2 as t2 on t1.B=t2.b
   left join
   @t3 as t3 on t1.A=t3.A
9 rs_trade
 
06.04.12
18:46
хотя хз. пятниццо вечер. не о работе мысли ))
10 vmv
 
06.04.12
18:47
не вникал, но думаю - это варинат Картахэна, т.е. проблема высосана из пальца и задачу можно решить без извратов
11 5 Элемент
 
06.04.12
18:51
(8) надо проверить что будет если вот так

declare @t2 table (B int, C int)
insert @t2 values (1, 1), (1, 2), (1, 3), (2, 1), (3, 1)

думаю что задвоится
12 5 Элемент
 
06.04.12
18:57
Вот так работает как надо

declare @t1 table (A int, B int)
insert @t1 values (1, 1)
insert @t1 values (2, 2)
insert @t1 values (3, 3)

declare @t2 table (B int, C int)
insert @t2 values (1, 1)
insert @t2 values (1, 2)
insert @t2 values (1, 3)
insert @t2 values (2, 1)
insert @t2 values (3, 1)

declare @t3 table (A int, C int)
insert @t3 values (1, 1)
insert @t3 values (2, 1)
insert @t3 values (3, 1)


select
   t3.A,
   t1.B,
   t2.C
   
from @t3 as t3
  left join @t1 as t1
      inner join @t2 as t2
      on (t2.b = t1.b)
  on (t1.a = t3.a)
      and (t2.c = t3.c)
13 5 Элемент
 
06.04.12
18:58
(10) реши, в (12) исходные данные таблиц
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший