Запрос мысли в наборах? - PullRequest
3 голосов
/ 13 марта 2019

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

  • У меня есть база данных с таблицей - DressSizes
  • У меня есть xml также с размерами платья.Этот xml передается в качестве параметра функции.
  • Моя цель - получить данные из таблицы в соответствии с переданным xml.

OUTPUT:

  1. если моя таблица содержит размеры, присутствующие в xml, я должен выбрать наименьший общий размер.
  2. если моя таблица не содержит размеры, присутствующие в xml, я должен выбрать наименьший размериз таблицы.
  3. если я передал значение null в функцию 2nd, должно произойти.

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

ALTER  function [dbo].[DressAvialableSizez]
(
    @DressID int,
    @ListXml xml = NULL
)
RETURNS TABLE 
AS
RETURN
(
    WITH CTE_SizeFilter as
    (
        SELECT Xmldata.Element.value('.','varchar(5)') AS Sizes, S.SortIndex AS FSort, S.DressID
              FROM @ListXml.nodes('/list/i') AS Xmldata (Element)
              INNER JOIN DressesSizes AS S ON S.DressSize = Xmldata.Element.value('.','varchar(5)')
        WHERE S.DressID = @DressID
    )

    SELECT TOP(1) F.Sizes, F.FSort, S.DressSize, S.SortIndex, S.DressID
    FROM DressesSizes AS S
    LEFT JOIN CTE_SizeFilter AS F ON S.DressSize = F.Sizes
    WHERE S.DressID = @DressID AND S.DressSize = IIF( EXISTS (
                        SELECT F.Sizes
                        FROM DressesSizes AS S
                        INNER JOIN CTE_SizeFilter AS F ON S.DressSize = F.Sizes),
                        F.Sizes,
                        S.DressSize)
    order by F.FSort, S.SortIndex
)

ПРОБЛЕМА:

Я показал свой код своему руководителю, но он / она продолжает говорить, что его можно упростить, и мне нужно думать в наборах.Я, кажется, изо всех сил пытаюсь понять, как «думать в сетах», и никакое прибегание к помощи не помогло.Так что я могу сделать, я потерян.

1 Ответ

2 голосов
/ 13 марта 2019

Попробуйте что-то вроде этого:

WITH CTE_SizeFilter as
(
    SELECT Xmldata.Element.value('.','varchar(5)') AS DressSize
    FROM @ListXml.nodes('/list/i') AS Xmldata (Element)
)

SELECT TOP(1) S.DressSize, S.SortIndex, S.DressID
FROM DressesSizes AS S
LEFT JOIN CTE_SizeFilter AS F ON S.DressSize = F.DressSize
WHERE S.DressID = @DressID
ORDER BY CASE WHEN F.Sizes IS NOT NULL THEN 1 ELSE 2 END, S.DressSize

Это просто выбирает наименьший размер платья, но отдает приоритет тем, которые присутствуют в XML.

PS.Мне непонятно, что вы должны делать с параметром @DressID.

Позднее редактирование: я использовал параметр @DressID, учитывая пересмотренный вопрос.

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