3

我正在拼命地避免在 SQL Server 2008 中出现 foreach 情况(我的背景是 c#)。

基本上,我有一个 SKU 列表。对于列表中的每个 SKU,我需要执行一些计算以确定该特定 SKU 是否会显示在网络上。

要获取我的 SKU 列表,我使用以下命令:

SELECT Feed.StyleCode as SKU
FROM [eCommerce].[dbo].[BABW_ItemFeed] as Feed
WHERE Feed.ProductDefinition = 'Kit'

返回这个:

在此处输入图像描述

为了计算每个 SKU 字段,我一直在使用这个:

DECLARE @SKU AS varchar(50)
SET @SKU= '11993_16559_16227'
SELECT
    @SKU as SKU,
    0 AS Quantity,
    MIN(ISNULL(Sending.IsActive, 'WEBNO')) AS IsActive, 
    MAX(ISNULL(Sending.IsDiscontinued, 1)) AS IsDiscontinued
FROM
( 
    SELECT * FROM [eCommerce].[dbo].[Split] (
      @SKU
      ,'_') 
) AS SplitSkus 
LEFT JOIN #SkusToSend AS Sending
    ON Sending.SKU = SplitSkus.items

返回这个:

在此处输入图像描述

现在我需要将两个表同步在一起,删除@SKU 声明。我认为我不能使用 UNION 来执行此操作,因为第二个功能需要预先了解它将处理的 SKU……而 JOIN 需要加入一些东西,而我不需要真的有。是否有一些我不熟悉的功能可以在没有循环机制的情况下一次性创建完整的 SKU 表?

4

2 回答 2

4

尝试CROSS APPLY... 它将为中的每一行执行您的 UDF BABW_ItemFeed

SELECT
    Feed.StyleCode as SKU,
    COUNT(*) AS Quantity,
    MIN(ISNULL(Sending.IsActive, 'WEBNO')) AS IsActive, 
    MAX(ISNULL(Sending.IsDiscontinued, 1)) AS IsDiscontinued
FROM
    [eCommerce].[dbo].[BABW_ItemFeed] as Feed 
    CROSS APPLY [eCommerce].[dbo].[Split] (Feed.StyleCode, '_') AS SplitSkus 
    LEFT JOIN #SkusToSend AS Sending
        ON Sending.SKU = SplitSkus.items
WHERE
    Feed.ProductDefinition = 'Kit'
GROUP BY
    Feed.StyleCode
于 2013-02-07T21:24:01.153 回答
0

停止使用 Min() 和 Max()...否则,SKU(不要使用 SELECT 中的参数)。

试试这个:

SELECT
    SKU,
    0 AS Quantity,
    MIN(ISNULL(Sending.IsActive, 'WEBNO')) AS IsActive, 
    MAX(ISNULL(Sending.IsDiscontinued, 1)) AS IsDiscontinued
FROM
( 
SELECT [eCommerce].[dbo].[Split] (Feed.StyleCode,'_')  as SKU
FROM [eCommerce].[dbo].[BABW_ItemFeed] as Feed
WHERE Feed.ProductDefinition = 'Kit'
) AS SplitSkus 
LEFT JOIN #SkusToSend AS Sending
    ON Sending.SKU = SplitSkus.items
于 2013-02-07T21:20:36.797 回答