1

我在使用with a带回一DISTINCT组真正的记录时遇到问题,其连接结果又被连接成一个逗号分隔的列表。ROW_NUMBER()LEFT JOINFOR XML PATH

目标是在 Web 应用程序中实现分页,因为可以返回大量记录,并且每次只返回一个子集,具体取决于选择的页码。

考虑以下 SQL:

SELECT DISTINCT IndustryCode, 
STUFF ( 
    (SELECT ',' + FE_LocationCode
    FROM tblLegacy_Codes i2
    WHERE c.IndustryCode = i2.IndustryCode
    FOR XML PATH(''))
,1,1,'') AS LegacyList
FROM Common_Clli c
LEFT JOIN tblLegacy_Codes legacy ON c.IndustryCode = legacy.IndustryCode
WHERE FE_LocationCode LIKE 'AUS%'

DISTINCT它按预期带回了一个非常好的列表:

IndustryCode    LegacyList
AUSTTX85        AUST.GET,AUST.LDD,AUST.UU4
AUSTTXTE        AUST.TE,AUST.TEH
AUSUTX78        AUST.AX3
SCHWAS01        AUSC01C1,AUSC01UT
SZBGASAH        AUSB01C1,AUSB01OB,AUSB01TA
SZBGASAI        AUSB01SN,AUVI01SN,AUVI02SN
SZBGASAK        AUSB03C1,AUSB03V1

但是 - 当 ROW_NUMBER 语法添加到上面查询的第一行时,它看起来像这样:

SELECT DISTINCT ROW_NUMBER() OVER(ORDER BY IndustryCode) AS rowNum, IndustryCode,...

结果现在包括每个 IndustryCode 的一行,因为 LegacyList 中有许多行,因为DISTINCT现在当然包括 rowNum。在不包括整个结果集的情况下,以下是列表中的第一个 IndustryCode 所看到的内容,因为它有 3 个关联的子记录:

rowNum  IndustryCode    LegacyList
1       AUSTTX85        AUST.GET,AUST.LDD,AUST.UU4
2       AUSTTX85        AUST.GET,AUST.LDD,AUST.UU4
3       AUSTTX85        AUST.GET,AUST.LDD,AUST.UU4

当然分页的最终实现是能够包装所有提到的SQL

SELECT * FROM (
  [ the SQL you've already seen ]
WHERE rowNum BETWEEN x and y

目前我不得不求助于在没有 ROW_NUMBER() 的情况下先执行 SQL 并将结果放入临时表中,然后从那里获取最终产品。不幸的是,这完全违背了通过每次只获取记录子集来最小化负载的意图。

我相当确信有一些我不知道的东西。这始终是一个安全的赌注。非常感谢您的帮助。

满足所有要求的最终产品最终是下面的 SQL。虽然提供的前 2 个解决方案都有帮助,但都没有解决不首先将查询的整个结果存放在临时样式表中的需要,无论该表是通用表表达式还是其他表。这个StackOverflow 线程让我得到了一个完整的解决方案。

SELECT RowNum, IndustryCode, FEList FROM
(
    SELECT ROW_NUMBER() OVER(ORDER BY IndustryCode) AS RowNum, IndustryCode, FEList
    FROM
    (
        SELECT DISTINCT IndustryCode,
        STUFF (
            (SELECT ',' + FE_LocationCode
            FROM tblLegacyCodes i2
            WHERE c.IndustryCode = i2.IndustryCode
            FOR XML PATH(''))
        ,1,1,'') AS LegacyList
        FROM Common_Clli c
        LEFT JOIN tblLegacyCodes legacy ON c.IndustryCode = legacy.IndustryCode
        WHERE FE_LocationCode LIKE 'AUS%'
    ) subInner
) subOuter
WHERE RowNum BETWEEN x AND y
4

3 回答 3

3

关于什么

SELECT ROW_NUMBER() OVER(ORDER BY IndustryCode) AS rowNum, IndustryCode, LegacyList
FROM
(
SELECT DISTINCT IndustryCode, 
STUFF ( 
    (SELECT ',' + FE_LocationCode
    FROM tblLegacy_Codes i2
    WHERE c.IndustryCode = i2.IndustryCode
    FOR XML PATH(''))
,1,1,'') AS LegacyList
FROM Common_Clli c
LEFT JOIN tblLegacy_Codes legacy ON c.IndustryCode = legacy.IndustryCode
WHERE FE_LocationCode LIKE 'AUS%'
) T
ORDER BY rowNum
于 2014-01-11T01:57:31.380 回答
1

您应该使用表表达式,例如

WITH MYTABLE AS (
SELECT DISTINCT IndustryCode, 
STUFF ( 
    (SELECT ',' + FE_LocationCode
    FROM tblLegacy_Codes i2
    WHERE c.IndustryCode = i2.IndustryCode
    FOR XML PATH(''))
,1,1,'') AS LegacyList
FROM Common_Clli c
LEFT JOIN tblLegacy_Codes legacy ON c.IndustryCode = legacy.IndustryCode
WHERE FE_LocationCode LIKE 'AUS%'
) SELECT ROW_NUMBER() OVER(ORDER BY IndustryCode) AS ROWNUM
, IndustryCode, LegacyList FROM MYTABLE
于 2014-01-11T02:02:34.863 回答
-1

System.Data.dll 中出现“System.Data.SqlClient.SqlException”类型的异常,但未在用户代码中处理

指定的参数过多。

参数中的错误已解决

@productCodeId varchar(15),
@productName varchar(60), 
@categoryCodeId varchar(15),
@subCategoryCodeId varchar(15),
@childSubCategoryCodeId varchar(15),
@productKeyword varchar(max),
@productCode varchar(25),
@productImage image=null,
@productDescShort varchar(max),
@ProductDescFull varchar(max),
@qualityProcessCertification varchar(max),
@userCodeId varchar(15),

 @productInfoCodeId varchar(15),
@productAdvantage varchar(max),
@productPriceInformation varchar(25),
@productAddPrice decimal(10,0),
@sampleAvailability varchar(5),
@deliveryLeadTime varchar(50),
@deliveryTerm varchar(max),
@minQuantity varchar(25),
@status varchar(15),


@id varchar(15)=null output ,
@id1 varchar(15)=null output   

开始

--declare @id varchar(15)=null --declare @id1 varchar(15)=null

从 tbl_product 中选择 @id=tp.productCodeId,@id1=tpi.productCodeId 作为 tp 内部连接 ​​tbl_ProductInformation 作为 tpi on tp.productCodeId= tpi.productCodeId 其中 tp.productCodeId=@productCodeId 和 tpi.productCodeId=@productCodeId

if @id=@productCodeId and @id1=@productCodeId

开始更新 tbl_product set
productName=@productName,categoryCodeId=@categoryCodeId, subCategoryCodeId=@subCategoryCodeId,childSubCategoryCodeId=@childSubCategoryCodeId, productKeyword=@productKeyword,productCode=@productCode, productImage=@productImage, productDescShort=@productDescShort, ProductDescFull=@ProductDescFull,qualityProcessCertification =@qualityProcessCertification, userCodeId=@userCodeId FROM tbl_product tp, tbl_ProductInformation tpi 其中 tp.productCodeId= @productCodeId 和 tpi.productCodeId=@productCodeId

update tbl_ProductInformation set productInfoCodeId=@productInfoCodeId, productAdvantage=@productAdvantage,
productPriceInformation=@productPriceInformation,
productAddPrice=@productAddPrice,sampleAvailability=@sampleAvailability,deliveryLeadTime=@deliveryLeadTime,
deliveryTerm=@deliveryTerm,minQuantity=@minQuantity,productCodeId=@productCodeId
FROM tbl_product tp, tbl_ProductInformation tpi

其中 tp.productCodeId=@productCodeId 和 tpi.productCodeId=@productCodeId end
else 开始
插入 tbl_product(productCodeId,productName,categoryCodeId, subCategoryCodeId,childSubCategoryCodeId,productKeyword,productCode,productImage,productDescShort, ProductDescFull,qualityProcessCertification,userCodeId) 值(@productCodeId, @productName,@categoryCodeId,@subCategoryCodeId,@childSubCategoryCodeId,@productKeyword,@productCode,@productImage,@productDescShort,@ProductDescFull,@qualityProcessCertification,@userCodeId)

insert into tbl_ProductInformation(productInfoCodeId,productAdvantage,
productPriceInformation,productAddPrice,sampleAvailability,deliveryLeadTime,deliveryTerm,minQuantity,productCodeId,status)
values(@productInfoCodeId,@productAdvantage,@productPriceInformation,@productAddPrice,
@sampleAvailability,@deliveryLeadTime,@deliveryTerm,@minQuantity,@productCodeId,@status)

结尾

于 2016-02-12T09:36:13.170 回答