2017-02-13 51 views
0

下面的查询生成的XML代码一行对符合条件的在我的表中每一行的行:SELECT返回NULL,而不是消除不适

SELECT 
(
    SELECT 
     [memberid], 
     [purchaseid], 
     CONVERT(DATE, [time]) AS [time], 
     [depID], 
     [theme], 
     [parentgroup], 
     (SELECT 
      [transactionid], 
      [quantity], 
      [price], 
      [articlenumber], 
      [articlename], 
      [articlesubgroupname], 
      [brand], 
      [articlecategory], 
      [maincategory] 
     FOR XML PATH('transaction'), TYPE) AS transactions 
    WHERE 
     quantity > 0 AND 
     memberid IS NOT NULL AND 
     DATALENGTH(RTRIM(LTRIM(memberid))) > 0 
    FOR XML PATH('receipt')) AS rowXml 
FROM 
    TransactionsDSEDelta AS t 

当我运行查询,而不是消除在条件quantity > 0不适用的行中,我得到了NULL。这意味着如果表中有10条记录,其中只有5条记录具有正数quantity,则返回所有10条记录,但其中5条记录是NULL

我想知道为什么我的查询生成这些记录?

+0

您能否正确分享我们的代购清单 – TheGameiswar

回答

2

where应在查询:

SELECT (
    SELECT 
     [memberid], 
     [purchaseid], 
     CONVERT(DATE,[time]) AS [time], 
     [depID], 
     [theme], 
     [parentgroup], 
     (
      SELECT 
       [transactionid], 
       [quantity], 
       [price], 
       [articlenumber], 
       [articlename], 
       [articlesubgroupname], 
       [brand], 
       [articlecategory], 
       [maincategory] 
      FOR XML PATH('transaction'), TYPE 
     ) AS transactions 
    FOR XML PATH('receipt') 
) AS rowXml 
FROM TransactionsDSEDelta AS t 
WHERE quantity > 0 AND 
     memberid IS NOT NULL AND 
     DATALENGTH(RTRIM(LTRIM(memberid))) > 0; 

SELECT语句中,不能过滤行。您需要过滤WHERE中的行。您的原始查询基本上是:

select . . ., 
     (select . . . 
     FOR XML PATH('receipt') 
     ) 
from TransactionsDSEDelta AS t; 

这会选择TransactionsDSEDelta中的所有内容。如果在子查询中过滤出某个值,则会得到一个NULL值(如您所见)。

+0

。谢谢。将接受StackOverflow允许我的答案。 – Disasterkid