Имя: Пароль:
1C
 
SQL как "заджойнить" одну таблицу
0 фобка
 
25.11.10
09:19
Привет
Пишу запрос:

|Select a.VIN, b.VIN  From archive_m a
|Left Join archive_m b On a.INTG_ORDRNMB = b.INTG_ORDRNMB
|Where a.TransportType = 1 and b.TransportType = 2

В таблице нет записей с TransportType = 2, то есть на выходе в теории должно быть две колонки в правом NULL. Но результат выполнения запроса в этом случае вообще ноль записей.

Пробую написать кривее:

|Select a.VIN, b.VIN  From
|(Select VIN,INTG_ORDRNMB from archive_m Where TransportType = 1) a
|Left Join
|(Select VIN,INTG_ORDRNMB from archive_m Where TransportType = 2) b |On a.INTG_ORDRNMB = b.INTG_ORDRNMB

результат какой нужно, но смущает сам запрос. Почему не отрабатывает первый запрос?
1 Ненавижу 1С
 
гуру
25.11.10
09:20
(0) плохо теорию читал
условие ставить надо тогда не в WHERE, а в ON
2 фобка
 
25.11.10
09:24
(1)
|Select a.VIN, b.VIN  From archive_m a
|Left Join archive_m b On a.INTG_ORDRNMB = b.INTG_ORDRNMB
|And a.TransportType = 1 and b.TransportType = 2

Так? Результат не правильный, оч. много записей на выходе, даже не знаю, что это за связь
3 Ненавижу 1С
 
гуру
25.11.10
09:25
(2) сам себе сформулируй что ты хочешь получить в результате
4 antoneus
 
25.11.10
09:27
inner join попробуй
5 Skom
 
25.11.10
09:28
(0) я че та не вкурил

From archive_m
Join archive_m

НАКУЯ???
6 Skom
 
25.11.10
09:28
ты чего получить то пытаешься???
7 фобка
 
25.11.10
09:29
(3) сформулировал, в таблице существуют две или одна запись с одинаковым идентификатором (INTG_ORDRNMB), и разными (TransportType). На выходе хочу иметь одну запись для одного идентификатора с разными значениями других полей.
Второй запрос отработал правильно, но смущает само написание, и думаю что отрабатывать он будет дольше
8 Skom
 
25.11.10
09:30
из хелпы

Поиск дублирующихся элементов

Выберем все элементы справочника Контрагенты, у которых совпадают ИНН

ТекстЗапроса = "

|SELECT

|  Спр.ID [Элемент $Справочник.Контрагенты],

|  $Спр.ИНН ИНН

|FROM

|  $Справочник.Контрагенты Спр

|WHERE

|  $Спр.ИНН IN

|  (SELECT

|     $Спр1.ИНН

|  FROM

|     $Справочник.Контрагенты Спр1

|  WHERE

|     $Спр1.ИНН <> ‘’

|  GROUP BY

|     $Спр1.ИНН

|  HAVING

|     COUNT(*) > 1)

|ORDER BY

|  $Спр.ИНН";
9 фобка
 
25.11.10
09:30
(4) мне нужны все записи из левой и совпадающие из правой
10 Ёпрст
 
гуру
25.11.10
09:31
(0)
or
11 фобка
 
25.11.10
09:31
(8) мне дубли не нужны, мне нужно все в одну "строку" сложить
12 фобка
 
25.11.10
09:32
(10) к сожалению нет, в правой теперь вместо Null все значения из левой
13 Ёпрст
 
гуру
25.11.10
09:33
(7) используй count  и having в условии к 1 табличке и привет, и не надо джойнить ничего
14 el-gamberro
 
25.11.10
09:35
union all
15 kroll
 
25.11.10
09:36
Смотри, убираем из первоначального запроса 1 условия (and b.TransportType = 2)

|Select a.VIN, b.VIN  From archive_m a
|Left Join archive_m b On a.INTG_ORDRNMB = b.INTG_ORDRNMB
|Where a.TransportType = 1

получается таблица на выходе. В колонке b.vin по твоему утверждению нет значений TransportType = 2. Так
А теперь добавляем условие and b.TransportType = 2 (получаем первоначальный текст запроса). Ессно не будет ничего на выходе... Ты же говоришь своим запросом - показать строки, для которых b.TransportType = 2

Понятно хоть разъяснил?
16 фобка
 
25.11.10
09:36
(13) ок, ща почитаю
(14) юнион даст две записи
17 el-gamberro
 
25.11.10
09:37
16 0_о какие 2 записи???
18 Ёпрст
 
гуру
25.11.10
09:37
(16) можешь не читать..@Skom тебе готовый код дал.
19 фобка
 
25.11.10
09:41
(17)
таблица
VIN INTG_ORDRNMB TransportType
a1  1            1    
a2  2            1
a1  1            2

на выходе с юнионом будет
VIN
a1
a2
a1

нужно
a.VIN b.VIN
a1    a1
a2    Null
20 упс
 
25.11.10
09:43
(0) Добавьте условие OR b.TransportType IS NULL к своему первоначальному запросу. Т.е. Where a.TransportType = 1 and (b.TransportType = 2 OR b.TransportType IS NULL).
21 Ёпрст
 
гуру
25.11.10
09:43
|Select max(VIN)  From archive_m
|Where TransportType = 1 or TransportType = 2
|Group by INTG_ORDRNM
|HAVING  COUNT(*) > 1
22 упс
 
25.11.10
09:44
(20) гоню
23 фобка
 
25.11.10
09:50
(21) ну, ребят..мне не нужна группировка. мне нужны будут еще остальные значения (там колонок больше 20) для обоих записей, но только в одной строке..
перекур
24 Skom
 
25.11.10
09:50
жесть.))
25 Skom
 
25.11.10
09:51
+23 ты давай тогда полностью что те надо. а то.....
26 Grusswelle
 
25.11.10
09:53
(0) Оришинальный ход мысли, правда-правда!
27 фобка
 
25.11.10
09:58
(15) видимо так и отрабатывает, алиясы игнорируются
(25) так вроде всё расписал, скрин приложить? :) или разъяснить реальный смысл задачи?
28 Skom
 
25.11.10
10:00
у тя там больше 20 колонок
я про это говорю
29 фобка
 
25.11.10
10:01
+ (27) это таблица перевозок, некоторые перевозки осуществляются в два этапа. Хочу в отчете видеть что было на первом и втором этапе для одного груза в одной строке. В таблице свзяь для одной перевозки - идентификатор INTG_ORDRNM
30 Skom
 
25.11.10
10:03
Select
   a.VIN,
   b.VIN
From archive_m as a
Left Join (
       Select
       b.VIN,
       INTG_ORDRNMB
       from archive_m b
           Where b.TransportType = 2
      ) as b on a.INTG_ORDRNMB = b.INTG_ORDRNMB
Where a.TransportType = 1
31 Skom
 
25.11.10
10:04
+30 так пойдет?
32 Skom
 
25.11.10
10:05
только во вложенном селекте алиасы наверное надо переделать. а может и не надо. не пробовал
33 фобка
 
25.11.10
10:06
(31) да, запрос отработал правильно, это нечто среднее между запросами из (0)
34 упс
 
25.11.10
10:08
(19) на вашем тестовом примере работает как надо:
Select a.VIN, b.VIN  From archive_m a
Left Join archive_m b On a.INTG_ORDRNMB = b.INTG_ORDRNMB and b.TransportType = 2
Where a.TransportType = 1
35 фобка
 
25.11.10
10:11
(34) спасибо! видимо это как раз то, что надо :)
36 Skom
 
25.11.10
10:12
жалко Sadovnikov'a "ушли" с мисты. он бы вам всем показал как надо.))
37 ДенисЧ
 
25.11.10
10:12
(36) Он сам ушёл.
38 Skom
 
25.11.10
10:13
(37) я знаю. а так же и причины тоже.
я же и нгаписал слово ушли в кавычках
39 Ёпрст
 
гуру
25.11.10
10:20
(38) ээ.. и давно ?
И с какой ветки ?
А то не было миня тут..
40 Skom
 
25.11.10
10:21
у меня в профиле аська есть. ты туда вопрос задай))) я тут не буду писать
41 Ёпрст
 
гуру
25.11.10
10:23
(40) нету аськи
42 Skom
 
25.11.10
10:27
в общем он больше на мисту не ходок.
а ты не заметил что его давно давно нету на форуме
43 Skom
 
25.11.10
10:31
примерно с августа он сюда не ходит
44 Ёпрст
 
гуру
25.11.10
10:33
(43) да вроде был..
хз.
45 bahmet
 
25.11.10
10:34
(35)нужна группировка по полю + суммирование строки по другому полю??? или у вас всегда максимум две строки с одинаковым INTG_ORDRNMB ?
46 Skom
 
25.11.10
10:38
(44) ну может не с августа но с сентября точно
47 фобка
 
25.11.10
10:41
(45) это не совсем группировка и суммирования нет, максимум две строки :)
как писал выше, уже помогли "заджойнить", спасибо =) всё будет хорошо
48 orefkov
 
25.11.10
11:00
(7)

|Select a.VIN, b.VIN  From archive_m a
|inner Join archive_m b On a.INTG_ORDRNMB = b.INTG_ORDRNMB and a.TransportType <> b.TransportType
49 фобка
 
25.11.10
12:07
(48) к сожалению нет. Иннер джоин - выдает 0 записей, лефт джоин - большое кол-во записей (видимо, потому что в таблице есть много записей с пустым INTG_ORDRNMB, для них и TransportType тоже пустой). Ну и пока непонятно как поведет себя запрос если в дальнейшем в базу буду добавлять что-то типа TransportType = 3..