sql - 成套查询思想?

标签 sql sql-server tsql

我有一个看起来像这样的任务:

  • 我有一个包含表格的数据库 - DressSizes
  • 我有一个 xml 也包含着装尺寸。此 xml 作为参数传递给函数。
  • 我的目标是根据xml从表中获取数据 通过。

输出:

  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
)

问题:

我向我的主管展示了我的代码,但他/她一直说它可以 简化了,我需要成套思考。我似乎很难理解如何“成套思考”并且没有 谷歌搜索没有帮助。那我该怎么办,我迷路了。

最佳答案

尝试这样的事情:

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 中存在的尺码。

附言。我不清楚您应该如何处理 @DressID 参数。

稍后编辑:考虑到修改后的问题,我使用了@DressID 参数。

关于sql - 成套查询思想?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55149758/

相关文章:

mysql - 用户文件数据库设计

sql - 返回列的前 n 个字母

sql-server - 打开在 SQL Server 的新实例中创建的数据库

sql - 在 SQL Server 中递归选择 2 个表

sql-server-2005 - 如何在 sql server 2005 中进行完全外部连接?

sql - PostgreSQL 和 PHP。从查询中获取会增加 char 字符串的空间

sql - 使用 db2 在 C 程序中嵌入 SQL

sql-server - 在Windows容器内连接到MS SQLServer上的“The semaphore timeout period has expired”

sql - CASE WHEN EXIST 应该返回 1 时返回 0

sql - 优化SQL查询、TSQL