我错过了什么条件,以便细节线匹配标题行

时间:2015-05-16 16:27:10

标签: sql sql-server-2012 for-xml for-xml-path

以下查询;

   DECLARE  @uname VARCHAR(10) = 'Dom',
        @pword VARCHAR(10) = 'Python',
        @sntype VARCHAR(1) = 'B',
        @action VARCHAR(10) = 'INSERT',
        @salesContractRef VARCHAR(10) = '',
        @auctionId NCHAR(10) = '';

SELECT
    RTRIM(@uname) AS '@uname',
    RTRIM(@pword) AS '@pword',

    (SELECT
    LandingId AS '@landingId',
        @snType AS '@snType',
        RTRIM(@action) AS '@action',
        COALESCE(@salesContractRef, '') AS '@salesContractRef',
        CONVERT(VARCHAR(10), DateOfPurchase, 112) AS '@saleDate',
        RTRIM(COALESCE(@auctionID, '')) AS '@auctionID',
        ISNULL(Logbook1 + ',', '') + ISNULL(Loogbook2 + ',', '') + ISNULL(Logbook3 + ',', '') AS '@logBookNums',
        ISNULL(LandingDecNumber1 + ',', '') + ISNULL(LandingDecNumber2 + ',', '') + ISNULL(LandingDecNumber3 + ',', '') AS '@landingDecNums',

        COALESCE(CONVERT(VARCHAR(10), LandingDate1, 112), '') AS '@landingDate1',
        COALESCE(CONVERT(VARCHAR(10), LandingDate2, 112), '') AS '@landingDate2',
        COALESCE(CONVERT(VARCHAR(10), LandingDate3, 112), '') AS '@landingDate3',
        RTRIM(CountryOfLanding) AS '@countryOfLanding',
        RTRIM(PortOfLanding) AS '@portOfLanding',
        (SELECT
            LandingDetails.LandingId AS '@landingId',
            SpeciesCode AS '@speciesCode',
            RTRIM(FishingArea) AS '@faoAreaCode',
            RTRIM(IcesZone) AS '@ZoneCode'
        FROM Landings.LandingDetails
        INNER JOIN Landings.LandingHeaders lh
            ON Landings.LandingDetails.LandingId = lh.LandingId
            WHERE lh.Posted = 0


        FOR XML PATH ('detail'), TYPE)

    FROM Landings.LandingHeaders
    JOIN Landings.Vessels
        ON Landings.LandingHeaders.VesselId = Vessels.VesselId
        WHERE Posted = 0
    FOR XML PATH ('sale'), TYPE)
FOR XML PATH ('abc')

产生此输出;

    <abc uname="Dom" pword="Python">
  <sale landingId="3388" snType="B" action="INSERT" salesContractRef="" saleDate="20130706" auctionID="" logBookNums="L7014  ,L7015  ,L7016  ," landingDecNums="" landingDate1="20130705" landingDate2="" landingDate3="" countryOfLanding="GBR" portOfLanding="GBHTG">
    <detail landingId="3388" speciesCode="BSS" faoAreaCode="27" ZoneCode="VIID" />
    <detail landingId="3388" speciesCode="PLE" faoAreaCode="27" ZoneCode="VIID" />
    <detail landingId="3388" speciesCode="HER" faoAreaCode="27" ZoneCode="VIID" />
    <detail landingId="3389" speciesCode="SBX" faoAreaCode="27" ZoneCode="VIID" />
    <detail landingId="3389" speciesCode="PLE" faoAreaCode="27" ZoneCode="VIID" />
    <detail landingId="3389" speciesCode="PLE" faoAreaCode="27" ZoneCode="VIID" />
  </sale>
  <sale landingId="3389" snType="B" action="INSERT" salesContractRef="" saleDate="20130706" auctionID="" logBookNums="" landingDecNums="" landingDate1="20130705" landingDate2="" landingDate3="" countryOfLanding="GBR" portOfLanding="GBHTG">
    <detail landingId="3388" speciesCode="BSS" faoAreaCode="27" ZoneCode="VIID" />
    <detail landingId="3388" speciesCode="PLE" faoAreaCode="27" ZoneCode="VIID" />
    <detail landingId="3388" speciesCode="HER" faoAreaCode="27" ZoneCode="VIID" />
    <detail landingId="3389" speciesCode="SBX" faoAreaCode="27" ZoneCode="VIID" />
    <detail landingId="3389" speciesCode="PLE" faoAreaCode="27" ZoneCode="VIID" />
    <detail landingId="3389" speciesCode="PLE" faoAreaCode="27" ZoneCode="VIID" />
  </sale>
</abc>

这几乎与我希望的一样,除了两条销售线上的细节线都是重复的,实际上它们只应出现在相关的销售线上。匹配登陆者显然是在拉出正确的细节线,只是不确定我错过了哪些额外的小调整。

由于

编辑:将SQL查询更改为以下内容;

DECLARE @uname VARCHAR(10) = 'Dom',
        @pword VARCHAR(10) = 'Python',
        @sntype VARCHAR(1) = 'B',
        @action VARCHAR(10) = 'INSERT',
        @salesContractRef VARCHAR(10) = '',
        @auctionId NCHAR(10) = '';

SELECT
    RTRIM(@uname) AS '@uname',
    RTRIM(@pword) AS '@pword',

    (SELECT

        @snType AS '@snType',
        RTRIM(@action) AS '@action',
        COALESCE(@salesContractRef, '') AS '@salesContractRef',
        CONVERT(VARCHAR(10), DateOfPurchase, 112) AS '@saleDate',
        RTRIM(COALESCE(@auctionID, '')) AS '@auctionID',
        ISNULL(Logbook1 + ',', '') + ISNULL(Loogbook2 + ',', '') + ISNULL(Logbook3 + ',', '') AS '@logBookNums',
        ISNULL(LandingDecNumber1 + ',', '') + ISNULL(LandingDecNumber2 + ',', '') + ISNULL(LandingDecNumber3 + ',', '') AS '@landingDecNums',

        COALESCE(CONVERT(VARCHAR(10), LandingDate1, 112), '') AS '@landingDate1',
        COALESCE(CONVERT(VARCHAR(10), LandingDate2, 112), '') AS '@landingDate2',
        COALESCE(CONVERT(VARCHAR(10), LandingDate3, 112), '') AS '@landingDate3',
        RTRIM(CountryOfLanding) AS '@countryOfLanding',
        RTRIM(PortOfLanding) AS '@portOfLanding',
        (SELECT

            SpeciesCode AS '@speciesCode',
            RTRIM(FishingArea) AS '@faoAreaCode',
            RTRIM(IcesZone) AS '@ZoneCode'


        FOR XML PATH ('detail'), TYPE)

    FROM Landings.LandingHeaders

    INNER JOIN Landings.LandingDetails ld
        ON Landings.LandingHeaders.LandingId = ld.LandingId

    WHERE Posted = 0

    FOR XML PATH ('sale'), TYPE)
FOR XML PATH ('abc')

现在产生以下输出;

    <abc uname="Dom" pword="Python">
  <sale snType="B" action="INSERT" salesContractRef="" saleDate="20130706" auctionID="" logBookNums="L7014  ,L7015  ,L7016  ," landingDecNums="" landingDate1="20130705" landingDate2="" landingDate3="" countryOfLanding="GBR" portOfLanding="GBHTG">
    <detail speciesCode="BSS" faoAreaCode="27" ZoneCode="VIID" />
  </sale>
  <sale snType="B" action="INSERT" salesContractRef="" saleDate="20130706" auctionID="" logBookNums="L7014  ,L7015  ,L7016  ," landingDecNums="" landingDate1="20130705" landingDate2="" landingDate3="" countryOfLanding="GBR" portOfLanding="GBHTG">
    <detail speciesCode="PLE" faoAreaCode="27" ZoneCode="VIID" />
  </sale>
  <sale snType="B" action="INSERT" salesContractRef="" saleDate="20130706" auctionID="" logBookNums="L7014  ,L7015  ,L7016  ," landingDecNums="" landingDate1="20130705" landingDate2="" landingDate3="" countryOfLanding="GBR" portOfLanding="GBHTG">
    <detail speciesCode="HER" faoAreaCode="27" ZoneCode="VIID" />
  </sale>
  <sale snType="B" action="INSERT" salesContractRef="" saleDate="20130706" auctionID="" logBookNums="" landingDecNums="" landingDate1="20130705" landingDate2="" landingDate3="" countryOfLanding="GBR" portOfLanding="GBHTG">
    <detail speciesCode="SBX" faoAreaCode="27" ZoneCode="VIID" />
  </sale>
  <sale snType="B" action="INSERT" salesContractRef="" saleDate="20130706" auctionID="" logBookNums="" landingDecNums="" landingDate1="20130705" landingDate2="" landingDate3="" countryOfLanding="GBR" portOfLanding="GBHTG">
    <detail speciesCode="PLE" faoAreaCode="27" ZoneCode="VIID" />
  </sale>
  <sale snType="B" action="INSERT" salesContractRef="" saleDate="20130706" auctionID="" logBookNums="" landingDecNums="" landingDate1="20130705" landingDate2="" landingDate3="" countryOfLanding="GBR" portOfLanding="GBHTG">
    <detail speciesCode="PLE" faoAreaCode="27" ZoneCode="VIID" />
  </sale>
</abc>

现在至少细节线与销售线匹配,但它为每个细节线生成单独的销售线。显然有一点点缺失。我尝试了一个Group By LandingHeaders.LandingId,但这似乎会导致更多问题。

1 个答案:

答案 0 :(得分:0)

我想这个

WHERE lh.Posted = 0

应该替换为

WHERE lh.Posted = 0 AND lh.LandingId=LandingId

如果它抱怨LandingId含糊不清,请为FROM Landings.LandingHeaders添加别名,以便它像FROM Landings.LandingHeaders lh1一样,然后尝试

WHERE lh.Posted = 0 AND lh.LandingId=lh1.LandingId