我有以下我一直在构建的 SQL 语句,它根据“产品数据”表中值的顺序返回一系列值
例如,产品 TV 具有屏幕尺寸,我们希望根据用户配置查询屏幕在指定范围内的电视。所以他们可能会说,给我 42 英寸两侧 3 种尺寸的替代电视。
此查询仅基于指定产品执行此操作:
DECLARE @ProductType INT = (
SELECT p.prod_ptype_id
FROM product p
WHERE p.prod_id = @ProductId
)
DECLARE @AttributeId INT = (
SELECT at.aptype_attr_id
FROM Attribute_ProductType at
INNER JOIN Attribute a
ON a.attr_id = at.aptype_attr_id
WHERE ISNULL(a.ReplacementTolerant, 0) = 1
AND at.aptype_ptype_id = @ProductType
)
DECLARE @ToleranceRange INT = (
SELECT a.ToleranceRange
FROM Attribute_ProductType at
INNER JOIN Attribute a
ON a.attr_id = at.aptype_attr_id
WHERE ISNULL(a.ReplacementTolerant, 0) = 1
AND at.aptype_ptype_id = @ProductType
)
DECLARE @AttributeValueIndex INT = (
SELECT DISTINCT ( av.attrval_index )
FROM Product_Attribute pa
INNER JOIN AttributeValue av
ON av.attrval_attr_id = pa.pattr_attr_id
WHERE av.attrval_id = (
SELECT pattr_attrval_id
FROM product_attribute pa3
WHERE pa3.pattr_prod_id = @ProductId
AND pa3.pattr_attr_id = @AttributeId
)
);
WITH ProductTypeAttributes
AS (
SELECT DISTINCT attrval_val
,attrval_index
,ROW_NUMBER() OVER ( ORDER BY attrval_index ) AS RowNumber
FROM Product_Attribute pa
INNER JOIN AttributeValue av
ON av.attrval_id = pa.pattr_attrval_id
INNER JOIN Product p
ON p.prod_id = pa.pattr_prod_id
WHERE pa.pattr_attr_id = @AttributeId
AND p.prod_ptype_id = @ProductType
GROUP BY attrval_val
,attrval_index
)
SELECT *
FROM ProductTypeAttributes
WHERE RowNumber >= (
(SELECT DISTINCT ( RowNumber )
FROM ProductTypeAttributes pta2
WHERE attrval_index = @AttributeValueIndex)
) - @ToleranceRange
AND ( RowNumber <= (
SELECT DISTINCT ( RowNumber )
FROM ProductTypeAttributes pta3
WHERE attrval_index = @AttributeValueIndex
) + @ToleranceRange )
这一切都很好,并且完全按照我的需要工作,尽管它可能需要一些优化,但现在我只想能够将它作为 POC 固定在需要的地方。
显而易见的选择是让它成为一个表函数——但是当我有这些“声明”语句时,我不知道要应用什么语法。
我查看了 MSDN 和示例,这些示例显示了与我认为我需要实现的类似示例,但我无法理解如何以这种方式将声明语句与表函数结合使用。
任何人都可以对此有所了解吗?
谢谢!