У меня есть настройки следующим образом: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", например.
* Теперь я написал свой запрос SELECT XML отлично. * Пожалуйста, покажите это * отлично. * Заявление :-) Возможно, вам будет проще указать вас на место.Если это сложнее, просьба предоставить образцы данных и ожидаемый результат. – Shnugo
@ Шнуго - я использую отлично, но он должен, вероятно, читать «подходит для моей цели в настоящее время» :) Это может быть не совсем прекрасно из-за лучших практик. – Lynchie