Этот запрос является подмножеством большого запроса, где я 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