SQL: установить условное значение на основе другой таблицы с критерием даты BETWEEN - PullRequest
0 голосов
/ 18 июня 2020

немного новичок в SQL, поискал в Интернете, но не смог найти ответа.

База данных SQL - это база данных Snowflake, которая, как мне кажется, является базой данных ANSI.

У меня есть таблица фактов, как показано ниже. Возможны комбинации одной и той же проблемы / UPC / склад / даты, поскольку новая запись добавляется всякий раз, когда сообщается о новой проблеме.

enter image description here

Исключить Столбец - это то, что я пытаюсь выяснить - он должен быть «Y», если комбинация Issue / UPC / Warehouse и Date находится в таблице исключений, показанной ниже. enter image description here

Сложность заключается в том, что данные находятся на уровне отдельного дня, но я хочу исключить их, если они попадают в диапазон.

Итак, вот, следует исключить только I-100/1234 / China / 5-5-2019 и I-324/1349 / NewYork / 6-1-2019, так как они соответствуют значениям и диапазонам дат в таблице исключений.

Я попробовал следующий запрос, но SELECT for DATES BETWEEN возвращает более 1 записи и дает мне эту ошибку Single-row subquery returns more than one row.

update "FactDetails" 
set "EXCLUDE" = 'Y'

where ("UPC","Warehouse", "Issue") in
    ("UPC","Warehouse", "Issue" from "Exclusions"
     where "PLANT_NUMBER" is not null
     and "ISSUE_CODE" is not null)

and "Date" between 
    (select "DATE_FROM" from "Exclusion"
     where "PLANT_NUMBER" is not null
     and "ISSUE_CODE" is not null) and
    (select "DATE_TO" from "Exclusion"
     where "PLANT_NUMBER" is not null
     and "ISSUE_CODE" is not null);

Другая сложность заключается в том, что таблица исключений может иметь «уровни» для исключения комбинации UPC / Выпуск / Склад. Warehouse - это наиболее специфичный c, а если только UP C, он охватывает большую часть данных. enter image description here

1 Ответ

1 голос
/ 18 июня 2020

Если я правильно понял, можно использовать exists:

update t
    set exclude = 'Y'
    where exists (select 1
                  from exclusions e
                  where e.issue_code = t.issue_code and
                        e.upc = t.upc and
                        e.warehouse = t.warehouse and
                        t.date between e.date_from and e.date_to
                 );
...