Имя: Пароль:
1C
 
Соединение таблиц в запросе
0 kolts23381
 
19.11.14
13:55
Маленький вопрос может кто знает. Есть левое соединение двух таблиц. А как сделать чтоб в результате запроса были строки, которых нет в левом соединении. Как бы инвертировать левое соединение
1 Maxus43
 
19.11.14
13:56
сделать правое и условие на null первой таблицы
2 18_plus
 
19.11.14
13:56
эммм.... правое соединение?
3 18_plus
 
19.11.14
13:57
или даже полное
4 spero
 
19.11.14
13:59
(0) Условие на null.
5 kolts23381
 
19.11.14
14:02
Затупил я ни левое соединение а внутреннее. То есть все строки из первой таблицы которые не соединяются со второй по опрделенному полю
6 18_plus
 
19.11.14
14:03
(5) тогда левое
7 Enders
 
19.11.14
14:04
(5) Тогда левое, правое или полное с проверкой на нулл в зависимости от того какие тебе строки надо получить
8 DS
 
19.11.14
14:06
9 DS
 
19.11.14
14:07
Можно на стену.
10 kolts23381
 
19.11.14
14:08
левое соединение ..... тут все ясно
ПО Таблица1.Поле1 = NULL ? Здесь непонятно
11 18_plus
 
19.11.14
14:09
(10) не ПО, а ГДЕ
12 18_plus
 
19.11.14
14:12
делать все варианты из (8) поочереди до достижения  просветления или почитать про декартово произведение и понять принцип соединения таблиц
13 kolts23381
 
19.11.14
14:13
А полностью как будет.
Левое соединение ....
ПО Таблица1.Поле1 = Таблица2.Поле1
ГДЕ Таблица2.Поле1 = Null ?
14 kolts23381
 
19.11.14
14:13
Вопрос не понимания логики а синтаксиса.
15 spero
 
19.11.14
14:13
(10) ГДЕ Таблица1.Поле1 ЕСТЬ NULL
16 spero
 
19.11.14
14:15
(13) Равно нельзя писать. Ничто не равно NULL.
17 kolts23381
 
19.11.14
14:17
Понял, так работает, хотя не до конца понял почему.
18 18_plus
 
19.11.14
14:17
(16) ничто и есть NULL, но не равно ему :)
19 Крошка Ру
 
19.11.14
14:18
(16) "Ничто не равно NULL". Прям на слезу пробило... О смысле жизни задуматься заставляет. Тут в соседней ветке философию обсуждают, туда надо отнести.
20 kolts23381
 
19.11.14
14:20
Почему не равно, а есть NULL это понятно. Не понял почему  ГДЕ Таблица1.Поле1 ЕСТЬ NULL. Но немного подумав, разобрался. Надо ведь разобраться, а не просто запомнить иначе забудется
21 olegves
 
19.11.14
14:20
(0) правое соединение
22 spero
 
19.11.14
14:24
(18) Нет. Null - исторически устоявшееся имя. Оно неудачно и новички часто путаются. Означает это имя не "ничто", а неопределенность. Поэтому ничто не равно Null. И Null тоже не равен Null.
23 AlexITGround
 
19.11.14
14:25
(21) Подумай, ведь "То есть все строки из первой таблицы которые не соединяются со второй по опрделенному полю"
24 hhhh
 
19.11.14
14:25
(20) ГДЕ проверяется уже для конечной объединенной таблицы
25 olegves
 
19.11.14
14:32
(23) в (0) об этом не сказано
26 olegves
 
19.11.14
14:33
(5) левое соединение
в блоке ГДЕ
ставишь Условие соединения основной таблицы Есть Null
27 18_plus
 
19.11.14
14:35
(22) это в sql это неопределённость, а в 1с неопределено отдельно есть :). я бы всё таки рассматривал null как отсутствие значения.
null <> null в запросе, а в коде очень даже равен.
28 18_plus
 
19.11.14
14:36
во, и педевикия меня поддерживает :)
NULL означает отсутствие, неизвестность информации. Значение NULL не является значением в полном смысле слова: по определению оно означает отсутствие значения и не принадлежит ни одному типу данных.
29 spero
 
19.11.14
14:39
(27) ... что добавляет путаницы. Не все что есть в 1С - разумно.
30 18_plus
 
19.11.14
14:43
(29) если разобраться, то всё очень логично. может не очень удобно и кажется неправильным, но как сделать лучше, я, например, не знаю.
31 AlexITGround
 
19.11.14
15:05
(27) "я бы всё таки рассматривал null как отсутствие значения."

Ох уж эти тонкости в понятиях :)
NULL означает НЕИЗВЕСТНО
32 18_plus
 
19.11.14
15:07
(31) что неизвестно?
33 spiller26
 
19.11.14
15:14
ОБЪЕДИНИТЬ ВСЕ чем тебе не подходит для 2х таблиц
34 spiller26
 
19.11.14
15:19
ВЫБРАТЬ
   Док1.Номенклатура КАК Номенклатура,
   Док1.ЕдИзм КАК ЕдИзм,
   NULL КАК Склад
ИЗ
   Дококумент.Поступление КАК Док1

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
   Док2.Номенклатура,
   NULL,
   Док2.Склад
  
ИЗ
   Дококумент.Списание КАК Док2

Ну и потом сгруппировать
35 AlexITGround
 
19.11.14
15:22
(33) ага, понял, мсье предлагает заменить медленно работающее левое соединение объединение - можно, если действительно это действительно даст прирост производительности запроса, в противном случае левым и все тут

(32) можно трактовать и так, но юные могут спутать такое выражение "отсутствующее значение" с пустой ссылкой, со значением Неопределено в системе 1С и т.д., т.е. в данном случае я предложил интерпретировать именно как неизвестное значение.
36 spiller26
 
19.11.14
15:34
(35) не нравиться можете тупо соединить левым

ВЫБРАТЬ
    "гр" КАК Гру,
    Таб1.Поле,
    Таб1.Номен,
    Таб1.ЕдИзм
ПОМЕСТИТЬ ВтТаб1
ИЗ
    Таб1 КАК Таб1
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    "гр" КАК Гру,
    Таб2.Поле,
    Таб2.Номен,
    Таб2.Склад
ПОМЕСТИТЬ ВтТаб2
ИЗ
    Таб1 КАК Таб2
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ЕСТЬNULL(ВтТаб1.Гру, ВтТаб2.Гру) КАК Поле1,
    ЕСТЬNULL(ВтТаб1.Поле, ВтТаб2.Поле) КАК Поле2,
    ЕСТЬNULL(ВтТаб1.Номен, ВтТаб2.Номен) КАК Поле3,
    ЕСТЬNULL(ВтТаб1.ЕдИзм, "") КАК Поле4,
    ЕСТЬNULL(ВтТаб2.Склад, "") КАК Поле5
ИЗ
    ВтТаб1 КАК ВтТаб1
        ЛЕВОЕ СОЕДИНЕНИЕ ВтТаб2 КАК ВтТаб2
        ПО ВтТаб1.Гру = ВтТаб2.Гру
37 kolts23381
 
19.11.14
15:42
Если использовать ОБЪЕДИНИТЬ ВСЕ то в итоговой таблице будут 2 раза повторяться строки с одинаковым значением поля. Останется только удалить повторяющиеся
38 AlexITGround
 
19.11.14
15:42
(37) ОБЪЕДИНИТЬ