2016-10-24 5 views
1

У меня есть настройки следующим образом:SQL XML Несколько элементов для каждой строки

TableA - ID, PolicyReference, PolicyNumber 

TableB - ID, Drivers, DOB, Sex 

запись вставляется в TableA, который имеет уникальный идентификатор, ссылка политики и номер политики этой политики.

В каждой «Политике» может быть несколько драйверов для этой политики, в таблице Б идентификатор UNIQUE и является JOIN между TableA и TableB, теперь я написал свой запрос SELECT XML до конца этого момента, потому что, когда я надену 't include TableB возвращает 1 строку для каждой записи, однако, когда я включаю TableB, если есть более одного драйвера, это бесполезно.

Ниже приведен пример XML-я currenly вернуться из 1 строки:

<PCNewBusiness> 
<PolicyNumber>999999999</PolicyNumber> 
<StartDate>2016-10-17T00:00:002017-10-17T00:00:00</StartDate> 
<Premium> 
    <NetAmount>100.00</NetAmount> 
    <IPT>10.00</IPT> 
</Premium> 
<Fee> 
    <NetAmount>50.00</NetAmount> 
    <IPT>0</IPT> 
</Fee> 
<Policyholder> 
    <PolicyholderType> 
    <PrivateIndividual> 
     <Name> 
     <Title>Mr</Title> 
     <FirstNames>Bob</FirstNames> 
     <LastName>Test</LastName> 
     </Name> 
     <DateOfBirth>1985-12-03T00:00:00</DateOfBirth> 
     <MaritalStatus>Single</MaritalStatus> 
     <Sex>Male</Sex> 
    </PrivateIndividual> 
    </PolicyholderType> 
    <Contact>Mr Bob Test</Contact> 
    <Address> 
    <Address1>This</Address1> 
    <Address2>Test</Address2> 
    <Address3>Address</Address3> 
    <Address4>Is Fake</Address4> 
    <Postcode>BB2 1AB</Postcode> 
    </Address> 
    <Phone>07777777777</Phone> 
    <Email>[email protected]</Email> 
</Policyholder> 
<Cover> 
    <CoverType>Comprehensive</CoverType> 
    <PolicyExcess>600</PolicyExcess> 
    <NoClaimsBonusYears>9</NoClaimsBonusYears> 
    <NCBOtherVehicle>0</NCBOtherVehicle> 
    <Use>Class1</Use> 
</Cover> 

Теперь, когда я присоединяюсь TableB она возвращает вышеуказанную информацию, но в два раза, я знаю, что это происходит потому, что присоединиться на В распознанном идентификаторе есть 2 строки, возвращаемые в TableB, потому что есть 2 драйвера.

Это будет мой ОЖИДАЕМЫЙ выход при соединении TableB.

<Cover> 
    <CoverType>Comprehensive</CoverType> 
    <PolicyExcess>600</PolicyExcess> 
    <NoClaimsBonusYears>9</NoClaimsBonusYears> 
    <NCBOtherVehicle>0</NCBOtherVehicle> 
    <Use>Class1</Use> 
</Cover> 
<Drivers> 
    <Driver> 
     <RelationshipToPolicyholder>Policyholder</RelationshipToPolicyholder> 
     <Name> 
      <Title>Mr</Title> 
      <FirstNames>Bob</FirstNames> 
      <LastName>Test</LastName> 
     </Name> 
     <DateOfBirth>1972-07-14</DateOfBirth> 
     <LicenceType>FullUK</LicenceType> 
     <PeriodLicenceHeld>MoreThanFiveYears</PeriodLicenceHeld> 
     <HomeAddress> 
      <Address1>Another Test</Address1> 
      <Address2>Address</Address2> 
      <Address3>Thats Fake</Address3> 
      <Postcode>AA1 1ZZ</Postcode> 
     </HomeAddress> 
     <PeriodResident>MoreThanFiveYears</PeriodResident> 
     <VehicleUseFrequency>Daily</VehicleUseFrequency> 
     <HasUseOfOtherVehicle>false</HasUseOfOtherVehicle> 
     <MainOccupation>Software Engineer</MainOccupation> 
     <HasCriminalConvictions>1</HasCriminalConvictions> 
    </Driver> 
    <Driver> 
     <RelationshipToPolicyholder>Spouse</RelationshipToPolicyholder> 
     <Name> 
      <Title>Mrs</Title> 
      <FirstNames>Jill</FirstNames> 
      <LastName>Test</LastName> 
     </Name> 
     <DateOfBirth>1972-07-14</DateOfBirth> 
     <LicenceType>FullUK</LicenceType> 
     <PeriodLicenceHeld>MoreThanFiveYears</PeriodLicenceHeld> 
     <HomeAddress> 
      <Address1>Another</Address1> 
      <Address2>Test</Address2> 
      <Address3>Address</Address3> 
      <Postcode>BB1 1BZ</Postcode> 
     </HomeAddress> 
     <PeriodResident>MoreThanFiveYears</PeriodResident> 
     <VehicleUseFrequency>Daily</VehicleUseFrequency> 
     <HasUseOfOtherVehicle>false</HasUseOfOtherVehicle> 
     <MainOccupation>Housewife</MainOccupation> 
     <HasCriminalConvictions>1</HasCriminalConvictions> 
    </Driver> 
</Drivers> 

Поэтому в основном я хочу, чтобы вернуть 1 строку данных, но когда я присоединяюсь к TableB мне нужно использовать данные из 2-х строк в TableB, чтобы заполнить все между Элементом "водителями.

Дополнительная информация, необходимая, пожалуйста, убирайте.

UPDATE

Мой нынешний ВЫБРАТЬ запрос по запросу.

SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL 
           )) AS "PolicyRecordNumber", 
    sub.Polno AS "PCNewBusiness/PolicyNumber", 
    sub.[Inception Date] AS "PCNewBusiness/StartDate", 
    sub.[Renewal Date] AS "PCNewBusiness/StartDate", 
    sub.PremXIPT AS "PCNewBusiness/Premium/NetAmount", 
    sub.PremIPT AS "PCNewBusiness/Premium/IPT", 
    sub.FeeXIPT AS "PCNewBusiness/Fee/NetAmount", 
    sub.FeeIPT AS "PCNewBusiness/Fee/IPT", 
    ph.Title AS "PCNewBusiness/Policyholder/PolicyholderType/PrivateIndividual/Name/Title", 
    ph.Firstname AS "PCNewBusiness/Policyholder/PolicyholderType/PrivateIndividual/Name/FirstNames", 
    ph.Surname AS "PCNewBusiness/Policyholder/PolicyholderType/PrivateIndividual/Name/LastName", 
    ph.DateOfBirth AS "PCNewBusiness/Policyholder/PolicyholderType/PrivateIndividual/DateOfBirth", 
    ph.MaritalStatus AS "PCNewBusiness/Policyholder/PolicyholderType/PrivateIndividual/MaritalStatus", 
    ph.Sex AS "PCNewBusiness/Policyholder/PolicyholderType/PrivateIndividual/Sex" , 
    ph.Contact AS "PCNewBusiness/Policyholder/Contact", 
    ph.Addr1 AS "PCNewBusiness/Policyholder/Address/Address1", 
    ph.Addr2 AS "PCNewBusiness/Policyholder/Address/Address2", 
    ph.Addr3 AS "PCNewBusiness/Policyholder/Address/Address3", 
    ph.Addr4 AS "PCNewBusiness/Policyholder/Address/Address4", 
    ph.Pcode AS "PCNewBusiness/Policyholder/Address/Postcode", 
    ISNULL(ph.Tel,ph.Tel2) AS "PCNewBusiness/Policyholder/Phone", 
    ph.Email AS "PCNewBusiness/Policyholder/Email", 
    cov.Cover AS "PCNewBusiness/Cover/CoverType", 
    cov.Excess AS "PCNewBusiness/Cover/PolicyExcess", 
    cov.NCBYears AS "PCNewBusiness/Cover/NoClaimsBonusYears", 
    cov.NCBOtherVeh AS "PCNewBusiness/Cover/NCBOtherVehicle", 
    cov.ClassOfUse AS "PCNewBusiness/Cover/Use", 
    --dri.RelationshipToPH AS "PCNewBusiness/Drivers/Driver/RelationshipToPolicyHolder", 
    --dri.Drivertitle AS "PCNewBusiness/Drivers/Driver/Title" , 
    --dri.FirstName AS "PCNewBusiness/Drivers/Driver/FirstNames" , 
    --dri.Surname AS "PCNewBusiness/Drivers/Driver/LastName" 
    veh.Make AS "PCNewBusiness/Vehicles/Vehicle/Make", 
    veh.Model AS "PCNewBusiness/Vehicles/Vehicle/Model", 
    veh.Reg AS "PCNewBusiness/Vehicles/Vehicle/RegistrationNumber", 
    veh.Body AS "PCNewBusiness/Vehicles/Vehicle/BodyType", 
    veh.Parking AS "PCNewBusiness/Vehicles/Vehicle/LocationWhenNotInUse", 
    '' AS "PCNewBusiness/Vehicles/Vehicle/AnnualMileage", 
    veh.YearMade AS "PCNewBusiness/Vehicles/Vehicle/YearOfManufacture", 
    veh.Engine_size AS "PCNewBusiness/Vehicles/Vehicle/EngineSizeCc", 
    veh.Purchasedate AS "PCNewBusiness/Vehicles/Vehicle/PurchaseDate", 
    veh.Value AS "PCNewBusiness/Vehicles/Vehicle/PurchasePrice", 
    veh.Value1 AS "PCNewBusiness/Vehicles/Vehicle/EstimatedValue", 
    veh.Seats AS "PCNewBusiness/Vehicles/Vehicle/NumberOfSeats", 
    veh.RightHandDrive AS "PCNewBusiness/Vehicles/Vehicle/RightHandDrive", 
    veh.Fuel AS "PCNewBusiness/Vehicles/Vehicle/FuelType" 
FROM dbo.Submissions sub 
    LEFT OUTER JOIN dbo.PolicyHolder ph ON ph.ID = sub.ID 
    LEFT OUTER JOIN dbo.Cover cov ON cov.ID = sub.ID 
    --LEFT OUTER JOIN dbo.Drivers dri ON dri.ID = sub.ID 
    LEFT OUTER JOIN dbo.Vehicle veh ON veh.ID = sub.ID 
    --LEFT OUTER JOIN dbo.Convictions con ON con.ID = sub.ID 
    --LEFT OUTER JOIN dbo.Claims cla ON cla.ID = sub.ID 
    --LEFT OUTER JOIN dbo.Medical med ON med.ID = sub.ID 
WHERE sub.[Transaction] = 'New Business' AND sub.[Ledger Date] >= dbo.Today()-7 
FOR  XML PATH('Policy') 

UPDATE 2

ОК У меня есть прогресс, я вошел в суб-запроса для моего "водителей Выберите, как показано ниже:

cov.Cover AS "PCNewBusiness/Cover/CoverType" , 
    cov.Excess AS "PCNewBusiness/Cover/PolicyExcess" , 
    cov.NCBYears AS "PCNewBusiness/Cover/NoClaimsBonusYears" , 
    cov.NCBOtherVeh AS "PCNewBusiness/Cover/NCBOtherVehicle" , 
    cov.ClassOfUse AS "PCNewBusiness/Cover/Use" , 
    (SELECT dri1.ID , 
       RelationshipToPH , 
       dri1.FirstName , 
       dri1.Surname 
     FROM  dbo.Drivers dri1 
       INNER JOIN dbo.Submissions sub1 ON sub1.ID = dri1.ID 
    FOR 
     XML PATH('Driver') , 
      TYPE 
    ) AS "PCNewBusiness/Drivers" 

Это возвращает драйверов в месте ввода нужно, чтобы они были ДОЛЖНЫ, подзапрос тянет через КАЖДУЮ строку в таблице «Драйверы» вместо соответствующих строк для каждого драйвера для этого UNIQUE ID.

Смотрите ниже:

<Cover> 
    <CoverType>Comprehensive</CoverType> 
    <PolicyExcess>600</PolicyExcess> 
    <NoClaimsBonusYears>4</NoClaimsBonusYears> 
    <NCBOtherVehicle>0</NCBOtherVehicle> 
    <Use>Class1</Use> 
</Cover> 
<Drivers> 
    <Driver> 
    <ID>1</ID> 
    <RelationshipToPH>Policyholder</RelationshipToPH> 
    <FirstName>John</FirstName> 
    <Surname>Doe</Surname> 
    </Driver> 
    <Driver> 
    <ID>2</ID> 
    <RelationshipToPH>Commonlaw Spouse</RelationshipToPH> 
    <FirstName>Bob</FirstName> 
    <Surname>Test</Surname> 
    </Driver> 
    <Driver> 
    <ID>2</ID> 
    <RelationshipToPH>Policyholder</RelationshipToPH> 
    <FirstName>Jill</FirstName> 
    <Surname>Test</Surname> 
    </Driver> 
    <Driver> 
    <ID>3</ID> 
    <RelationshipToPH>Policyholder</RelationshipToPH> 
    <FirstName>Jane</FirstName> 
    <Surname>Gowe</Surname> 
    </Driver> 
    <Driver> 
    <ID>4</ID> 
    <RelationshipToPH>Policyholder</RelationshipToPH> 
    <FirstName>Dave</FirstName> 
    <Surname>Grace</Surname> 
    </Driver> 

Моя первая строка должна возвращать только 2 водителей с ID "2", например.

+1

* Теперь я написал свой запрос SELECT XML отлично. * Пожалуйста, покажите это * отлично. * Заявление :-) Возможно, вам будет проще указать вас на место.Если это сложнее, просьба предоставить образцы данных и ожидаемый результат. – Shnugo

+0

@ Шнуго - я использую отлично, но он должен, вероятно, читать «подходит для моей цели в настоящее время» :) Это может быть не совсем прекрасно из-за лучших практик. – Lynchie

ответ

2

собственные обновления 2 было именно то, что я хотел бы предложить вам ...

Теперь я думаю, остальное легко:

Изменение JOIN ваших подразделов выбрать для простой WHERE:

(SELECT dri1.ID , 
      RelationshipToPH , 
      dri1.FirstName , 
      dri1.Surname 
    FROM  dbo.Drivers dri 
    WHERE dri.ID=sub.ID 
FOR 
    XML PATH('Driver') , 
     TYPE 
) AS "PCNewBusiness/Drivers", 
+0

Привет, Шнуго, это именно то, что я только что сделал, вернулся на страницу, чтобы набрать мой ответ. Я дам ему тик все равно за то, что уделил время, чтобы ответить на мой запрос :) – Lynchie

+0

@ Lynchie, thx и Happy code! – Shnugo

+1

@ Lynchie Я тоже проголосовал за ваш вопрос ... – Shnugo

 Смежные вопросы

  • Нет связанных вопросов^_^