Выберите элементы из входных данных, которые не существуют в базе данных - PullRequest
0 голосов
/ 09 июня 2011

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

У меня есть некоторые данные:

Table: Items
        ID  |   Material   |  Form
    ----------------------------------
        1   |   Aluminium  |  Sheets
       ------------------------------
        1   | Carbon Steel |  Bars
       ------------------------------
        2   |   Aluminium  |  Bars

Я хочу найти совпадающие идентификаторы, которые удовлетворяют данному входу.Ввод может быть в одной из трех форм, и может иметь одну или несколько строк.Когда вход имеет несколько строк, элемент должен удовлетворять ВСЕМ строкам.Примеры ввода приведены ниже:

@Input type 1: (just a material, one or multiple allowed)    
    Material     |  Form
    -------------------
    Aluminium    |  NULL

@Input type 2: (material and a form, one or multiple allowed)   
    Material     |  Form
    -------------------
    Aluminium    |  Sheets

@Input type 3: (one or more material and form, with one or more materials)  
    Material     |  Form
    -------------------
    Aluminium    |  Sheets
    Carbon Steel |  NULL

Я написал запрос, который может обрабатывать тип ввода 1, и запрос для типа ввода 2, но мне нужно объединить их и уметь обрабатывать тип ввода3.

Запрос для типа ввода 1:

Select *
From table

OUTER APPLY(
  SELECT top(1) i.Material
  FROM @Input i --Input type 1
  WHERE i.Material NOT IN
    (SELECT items.Material
    FROM Items
    WHERE items.id = table.id)
)MaterailCondition

--this makes sure that there isn't anything selected that does not match Material
WHERE MaterialCondition.Material IS NULL

Запрос для типа ввода 2:

Select *
From table

OUTER APPLY(
  SELECT top(1) i.Material, i.Form
  FROM @Input i --Input type 1
  WHERE i.Material NOT EXISTS
    (SELECT *
    FROM Items
    WHERE items.id = table.id
    AND items.Material = i.Material
    AND items.Form = i.Form)
)MaterailCondition

--this makes sure that there isn't anything selected that does not match Material
WHERE MaterialCondition.Form IS NULL

Снова, на этом этапе мне нужнобыть в состоянии

  • Объединить запросы в один и тот же внешний блок применения
  • Ввести тип ввода 3

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

РЕДАКТИРОВАТЬ

Здесь был бы желаемый результат запроса

ID  |  Name      |  MaterialCondition.Material
-------------------------------------------
23  | Some Item  |  (any text, such as 'Carbon Steel') <-- This is not a match
12  | Other Item |  NULL                               <-- This IS a match

--(the where clause will filter these out, by saying)
WHERE MaterialCondition.Material IS NULL

Такпросто номер ID 12 возвращается:

ID  |  Name      |  MaterialCondition.Material
-------------------------------------------
12  | Other Item |  NULL                

1 Ответ

0 голосов
/ 09 июня 2011

До сих пор я дошел до состояния, которое работает, как это:

Select *
From table
OUTER APPLY(  
 SELECT top(1) i.Material  
 FROM @Input i --Input type 1  
 WHERE i.Material NOT IN    
  (SELECT items.Material    
  FROM Items    
  WHERE items.id = table.id)
)MaterailCondition

OUTER APPLY(  
 SELECT top(1) i.Material, i.Form  
 FROM @Input i --Input type 1  
 WHERE i.Material NOT EXISTS    
  (SELECT *    
  FROM Items    
  WHERE items.id = table.id    
  AND items.Material = i.Material    
  AND items.Form = i.Form)
)MaterailCondition2

--this makes sure that there isn't anything selected that does not match Material
WHERE MaterialCondition.Material IS NULL AND MaterialCondition2.Form IS NULL

Это будет работать правильно, и у меня есть внешняя заявка для типа ввода 1 и типа ввода 2, тогда внешняя заявка позаботится об их соответствующих частях типа ввода 3. Я предполагаю, что просто надеялся содержать это логика внутри одного OUTER APPLY

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...