Как удалить все сгруппированные записи на основе ошибочных критериев для одной записи - PullRequest
0 голосов
/ 05 апреля 2019

У меня есть постоянная проблема с запросами, которые не просто удаляют одну запись, которая не соответствует критериям, но удаляют все записи, основанные на некоторой другой группировке.Например, для таблицы со следующим:

Name     ProdType   Prod   Spoiled     DateReceived  
Jack     Fruit      Apple   N          1/1/2019
Jack     Fruit      Pear    Y          1/1/2018
Jack     Fruit      Orange  N          1/1/2019
Jack     Vegetable  Okra    N          1/1/2019
Jack     Vegetable  Squash  N          1/1/2018
Jill     Fruit      Apple   N          4/1/2019
Jill     Fruit      Cherry  N          4/1/2019
Jill     Vegetable  Corn    Y          4/1/2019
Jill     Vegetable  Okra    N          4/1/2019

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

До сих пор я былиспользуя вложенные операторы select, но по мере добавления критериев становится все труднее.

SELECT NAME
    ,PRODTYPE
    ,PROD
    ,SPOILED
    ,DATEREC
FROM inventory
WHERE NAME in (
    SELECT DISTINCT Name from (SELECT Name FROM inventory
                WHERE ProdType = 'fruit' as Data)

    WHERE Name NOT IN (SELECT Name from inventory WHERE Name in (
            SELECT Name 
            WHERE Spoiled = 'Y'))
    )

В примере с Джеком и Джилл мой запрос вернул бы 2 результата для Джилл (1 для каждого фрукта) и ни одного дляДжек.

Обычно участвуют как минимум две таблицы.Я сталкиваюсь с проблемами (обычно безрезультатно, или я даже не могу получить прошлые ошибки при выполнении запроса), когда добавляю критерии, например, нормально, если он испорчен, если он был получен до даты X, а также при добавлении дополнительных таблиц.

Это способ вложения выборок для создания списков с последующим поиском наилучшего способа или SQL предлагает что-то лучше?

Спасибо.

Ответы [ 2 ]

1 голос
/ 05 апреля 2019

Существует множество творческих способов выразить запрос в SQL. Ваш пример также может быть реализован таким образом, например:

SELECT
    name,
    prodtype,
    prod,
    spoiled,
    daterec
FROM
    inventory
WHERE
    prodtype = 'Fruit' AND
    name NOT IN (SELECT name
                 FROM inventory
                 WHERE prodtype = 'Fruit' AND spoiled = 'Y')

Чтобы определить правильный (или хотя бы приемлемый) путь, нужно много упражнений. И часто не существует «стандартного» решения для определенного запроса данных. Будут сценарии, в которых вам будет полностью необходимо изменить / переписать ваши запросы, если изменится одно требование, которое не вписывается в существующую структуру запроса.

1 голос
/ 05 апреля 2019

С НЕ СУЩЕСТВУЮЩИМ:

select i.* 
from inventory i
where 
  i.prodtype = 'Fruit' and
  not exists (
    select 1 from inventory
    where name = i.name and
    prodtype = 'Fruit' and
    spoiled = 'Y'
  )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...