8.х Разность двух таблиц в запросе

Тема в разделе "Отчеты и обработки для "1С:Предприятие 8"", создана пользователем Yury, 13 июн 2012.

  1. TopicStarter Overlay
    Yury
    Offline

    Yury Опытный в 1С

    Регистрация:
    22 дек 2011
    Сообщения:
    355
    Симпатии:
    4
    Баллы:
    29
    Здравствуйте,

    имею две одинаковых по структуре таблицы А и Б. Б является выборкой из А по определенному условию. Хочу в результате получить выборку всех элементов из таблицы А, кроме тех, которые есть в Б.

    Делаю вот так:
    Код:
    ВЫБРАТЬ
    ОбъединеннаяТаблица.Период КАК Период,
    ОбъединеннаяТаблица.Регистратор,
    ОбъединеннаяТаблица.Номенклатура,
    ОбъединеннаяТаблица.НоменклатурнаяГруппа,
    ОбъединеннаяТаблица.СуммаПоПроводке,
    ОбъединеннаяТаблица.ВидОперации,
    ОбъединеннаяТаблица.ВидПродукции
    ИЗ
    ОбъединеннаяТаблица КАК ОбъединеннаяТаблица
    ГДЕ
    НЕ(ОбъединеннаяТаблица.Регистратор В
    (ВЫБРАТЬ
    Исключить.Регистратор
    ИЗ
    Исключить)
    И ОбъединеннаяТаблица.Номенклатура В
    (ВЫБРАТЬ
    Исключить.Номенклатура
    ИЗ
    Исключить)
    И ОбъединеннаяТаблица.ВидПродукции В
    (ВЫБРАТЬ
    Исключить.ВидПродукции
    ИЗ
    Исключить))
    Не всегда работает верно. В чем может быть косяк?
  2. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Пример дайте, когда не верно.
    Например если возьмем следующие таблицы:
    Таблица ОбъединеннаяТаблица:
    Таблица Исключить:

    Судя по вашему запросу в итоговой выборке будет две строки:
    Вам надо так, или иначе?

    Все зависит от задачи.
    Подозреваю, что в указанном примере вам нужно чтобы в итоговой выборке при данных начальных условиях остались все 4 строки. Тогда нужно переписать запрос.
  3. Allizar
    Offline

    Allizar Опытный в 1С

    Регистрация:
    24 сен 2006
    Сообщения:
    413
    Симпатии:
    0
    Баллы:
    26
    Наверное, так:

    Код:
    ВЫБРАТЬ
    ОбъединеннаяТаблица.Период КАК Период,
    ОбъединеннаяТаблица.Регистратор,
    ОбъединеннаяТаблица.Номенклатура,
    ОбъединеннаяТаблица.НоменклатурнаяГруппа,
    ОбъединеннаяТаблица.СуммаПоПроводке,
    ОбъединеннаяТаблица.ВидОперации,
    ОбъединеннаяТаблица.ВидПродукции
    ИЗ
    ОбъединеннаяТаблица КАК ОбъединеннаяТаблица
    ГДЕ
    НЕ (ОбъединеннаяТаблица.Регистратор, ОбъединеннаяТаблица.Номенклатура,
    ОбъединеннаяТаблица.ВидПродукции, ОбъединеннаяТаблица.ВидПродукции) В
    (ВЫБРАТЬ
    Исключить.Регистратор, Исключить.Номенклатура, Исключить.ВидПродукции, Исключить.ВидПродукции
    ИЗ
    Исключить)
    
    Хотя можно использовать и соединение.
  4. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    [off]
    да не, так красивее мне кажется, чем с соединением.
    [/off]
  5. TopicStarter Overlay
    Yury
    Offline

    Yury Опытный в 1С

    Регистрация:
    22 дек 2011
    Сообщения:
    355
    Симпатии:
    4
    Баллы:
    29
    Мой пример работает, если в таблице ОбъединеннаяТаблица, например:

    Регистратор1 - Номенклатура1 - Видоперации1 - ВидПродукции1 - СуммаПопроводке1
    Регистратор1 - Номенклатура1 - Видоперации2 - ВидПродукции1 - СуммаПопроводке1
    ...
    Регистратор2 - Номенклатура1 - Видоперации1 - ВидПродукции1 - СуммаПопроводке2
    Регистратор2 - Номенклатура1 - Видоперации1 - ВидПродукции1 - СуммаПопроводке3

    А таблица исключений содержит
    Регистратор1 - Номенклатура1 - Видоперации1 - ВидПродукции1 - СуммаПопроводке1

    То я получаю на выходе все нормально:

    Регистратор1 - Номенклатура1 - Видоперации2 - ВидПродукции1 - СуммаПопроводке1
    ...
    Регистратор2 - Номенклатура1 - Видоперации1 - ВидПродукции1 - СуммаПопроводке2
    Регистратор2 - Номенклатура1 - Видоперации1 - ВидПродукции1 - СуммаПопроводке3

    А если таблица Исключений содержит 2 похожих строки, например:

    Регистратор1 - Номенклатура1 - Видоперации1 - ВидПродукции1 - СуммаПопроводке1
    Регистратор1 - Номенклатура1 - Видоперации2 - ВидПродукции1 - СуммаПопроводке5

    То из ОбъединеннаяТаблица удаляться обе строки,

    Было предложение сделать через объединение. Приведите пример, плиз.
  6. TopicStarter Overlay
    Yury
    Offline

    Yury Опытный в 1С

    Регистрация:
    22 дек 2011
    Сообщения:
    355
    Симпатии:
    4
    Баллы:
    29
    В условие "В" могут попасть более одной записи удовленворяющей условию, поэтому в моем запросе и вычитается лишку. Если есть пример как сделать через объединение, покажите, плиз.
  7. Allizar
    Offline

    Allizar Опытный в 1С

    Регистрация:
    24 сен 2006
    Сообщения:
    413
    Симпатии:
    0
    Баллы:
    26
    Вы хотите сказать, что с приведенным мною кодом Вас тоже постигла неудача?
  8. TopicStarter Overlay
    Yury
    Offline

    Yury Опытный в 1С

    Регистрация:
    22 дек 2011
    Сообщения:
    355
    Симпатии:
    4
    Баллы:
    29
    Так он такой же каки мой. Нельзя использовать "В", нужно точное соответствие на равенство
  9. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Пример не совсем понял конечно.

    С соединением будет приблизительно так:
    Но насколько я понял задачу, Allizar привел вам правильный пример кода. Возможно у вас дело в другом. Словами опишите задачу, что, откуда, по каким условиям надо выбрать.

    Не такой же. Попробуйте.
  10. vartanet
    Offline

    vartanet Опытный в 1С Команда форума

    Регистрация:
    16 ноя 2010
    Сообщения:
    2.698
    Симпатии:
    15
    Баллы:
    29
    я б соединил левым соединением таблицу А и таблицу Б. наложил бы условие => оставить только те записи, у которых есть левая часть, но нет правой.
  11. TopicStarter Overlay
    Yury
    Offline

    Yury Опытный в 1С

    Регистрация:
    22 дек 2011
    Сообщения:
    355
    Симпатии:
    4
    Баллы:
    29

    Вот такой запрос как раз выбирает то что нужно выкинуть:
    Код:
    ВЫБРАТЬ
    ОбъединеннаяТаблица.Период КАК Период,
    ОбъединеннаяТаблица.Регистратор,
    ОбъединеннаяТаблица.Номенклатура,
    ОбъединеннаяТаблица.СуммаПоПроводке,
    ОбъединеннаяТаблица.ВидОперации,
    ОбъединеннаяТаблица.ВидПродукции
    ИЗ
    Исключить КАК Исключить
    ЛЕВОЕ СОЕДИНЕНИЕ ОбъединеннаяТаблица КАК ОбъединеннаяТаблица
    ПО (ОбъединеннаяТаблица.Регистратор = Исключить.Регистратор)
    И (ОбъединеннаяТаблица.Номенклатура = Исключить.Номенклатура)
    И (ОбъединеннаяТаблица.ВидОперации = Исключить.ВидОперации)
    И (ОбъединеннаяТаблица.ВидПродукции = Исключить.ВидПродукции)
    И (ОбъединеннаяТаблица.СуммаПоПроводке = Исключить.СуммаПоПроводке)
    УПОРЯДОЧИТЬ ПО
    Период
    
    Как его обратить?
  12. TopicStarter Overlay
    Yury
    Offline

    Yury Опытный в 1С

    Регистрация:
    22 дек 2011
    Сообщения:
    355
    Симпатии:
    4
    Баллы:
    29
    Спасибо! Объединение сработало

Поделиться этой страницей