#sql-server
#sql-сервер
Вопрос:
У меня есть небольшой вопрос относительно использования sql-server. У меня есть две таблицы, одна для страховщиков, а другая для назначений. Моя цель — создать запрос, в котором я получаю все встречи, в которых используются два конкретных страховщика. Например, мне нужны все назначения, которые используют state farm и USAA в качестве страховщика.
SELECT TOP (1000) [Id]
,[Name]
,[AddressOne]
,[AddressTwo]
,[City]
,[State]
,[Zip]
,[PrimaryPhone]
,[SecondaryPhone]
,[Fax]
,[InsurerStatusId]
,[InsuranceGroupId]
,[ModifiedDate]
,[ModifiedBy]
,[ReportInsuranceName]
,[ReportInsuranceId]
FROM [AssignmentManagement].[dbo].[Insurers]
SELECT TOP (1000) [Id]
,[AppointmentTypeId]
,[AssignmentId]
,[StaffId]
,[CalendarId]
,[AppointmentDate]
,[ScheduledDate]
,[RequestedAppointmentDate]
,[Notes]
,[Hour]
,[Minute]
,[DayOfTheWeek]
,[CenterId]
,[AppointmentStatusId]
,[RentalCar]
,[ScheduledBy]
FROM [AssignmentManagement].[dbo].[Appointments]
SELECT TOP (1000) [Id]
,[InsurerId]
,[RepairCategoryId]
,[AssignmentStatusId]
,[OriginalCenterId]
,[OriginalStaffId]
,[LossCategoryId]
,[ClaimNumber]
,[PolicyNumber]
,[LossDate]
,[TotalLossIndicator]
,[Source]
,[PrimaryCustomerType]
,[InsuredCustomerId]
,[OwnerCustomerId]
,[ClaimCustomerId]
,[CustomerServiceRepresentativeId]
,[TransactionId]
,[Towing]
,[RentalCar]
,[IsDriveIn]
,[Deductible]
,[DeductibleStatus]
,[PhotosOnly]
,[LeftMessageSequence]
,[VehicleYear]
,[VehicleMake]
,[VehicleMakeDescription]
,[VehicleModel]
,[VehicleColor]
,[VIN]
,[Odometer]
,[LicenseNumber]
,[LicenseState]
,[VehicleLocationName]
,[VehicleAddressOne]
,[VehicleAddressTwo]
,[VehicleCity]
,[VehicleState]
,[VehicleZip]
,[VehiclePhone1]
,[VehiclePhone1Ext]
,[VehiclePhone2]
,[VehiclePhone2Ext]
,[VehicleContactFirstName]
,[VehicleContactLastName]
,[VehicleCondition]
,[VehicleNotes]
,[Impact1]
,[Impact2]
,[ClaimOfficeName]
,[AgentName]
,[AgentFirstName]
,[AgentLastName]
,[AgentAddressOne]
,[AgentAddressTwo]
,[AgentCity]
,[AgentState]
,[AgentZip]
,[AgentLicenseNumber]
,[AgentPhone]
,[AgentPhoneExt]
,[AgentFax]
,[AgentEmail]
,[PriorDamage]
,[Notes]
,[DamageNotes]
,[SpecialInstructions]
,[DispatchNotes]
,[LossNotes]
,[OtherNotes]
,[AssignmentDate]
,[ReportDate]
,[NextCallDate]
,[CreateDate]
,[CreatedBy]
,[IsEstimateMatch]
,[IsROMatch]
,[IsDriveable]
,[ModifiedDate]
,[UpdatedBy]
,[AccessedBy]
,[LegacyAsgnNavId]
,[LegacyAsgnNo]
,[AssignmentStatusReasonId]
,[RentalAgencyId]
,[Estimate_Id]
,[NextCallDateUpdatedBy]
,[RentalReservationNumber]
,[IsHail]
,[InitialOriginatingCenterId]
,[UnscheduledDropId]
,[UnscheduledExplanation]
,[RepairLevelId]
,[AdjusterFirstName]
,[AdjusterLastName]
,[AdjusterPhoneExt]
,[AdjusterPhoneNumber]
,[VehicleTrim]
,[VehicleOptions]
,[AdditionalInformation]
,[DeliveryLocation]
,[DeliveryCenterId]
,[RequestedAppointmentDate]
FROM [AssignmentManagement].[dbo].[Assignments]
Комментарии:
1. Я не вижу никакой связи между двумя таблицами. Существует ли третья таблица, которая объединяет эти 2?
2. является ли [StaffID] из таблицы [Назначения] соединением с [Id] из таблицы [Страховщики]?
3. @WEI_DBA добавил третью таблицу, которая может решить проблему.
4. Все еще неясно, какие таблицы связаны друг с другом. Мы могли бы предположить, что
Assignments.InsurerId = Insurers.Id
иAppointments.AssignmentId = Assignments.Id
the, но, не видя вашей схемы и внешних ключей, это было бы просто предположением. И я бы переименовал эти первичные ключи во что-то более значимое для дальнейшего использования.
Ответ №1:
Похоже, что назначение [AssignmentId] относится к полю страховщика [Id]:
-- Assuming a.AssignmentId = i.Id
-- Assuming USAA's ID = 12345 and State Farm's ID = 54321:
SELECT i.[Id]
,i.[Name]
,i.[AddressOne]
,i.[AddressTwo]
,i.[City]
,i.[State]
,i.[Zip]
,i.[PrimaryPhone]
,i.[SecondaryPhone]
,i.[Fax]
,i.[InsurerStatusId]
,i.[InsuranceGroupId]
,i.[ModifiedDate]
,i.[ModifiedBy]
,i.[ReportInsuranceName]
,i.[ReportInsuranceId]
,a.[Id]
,a.[AppointmentTypeId]
,a.[AssignmentId]
,a.[StaffId]
,a.[CalendarId]
,a.[AppointmentDate]
,a.[ScheduledDate]
,a.[RequestedAppointmentDate]
,a.[Notes]
,a.[Hour]
,a.[Minute]
,a.[DayOfTheWeek]
,a.[CenterId]
,a.[AppointmentStatusId]
,a.[RentalCar]
,a.[ScheduledBy]
FROM [AssignmentManagement].[dbo].[Insurers] i
JOIN [AssignmentManagement].[dbo].[Appointments] a
ON a.AssignmentId = i.Id
WHERE i.Id IN(12345, 54321)
ORDER BY i.ID, a.[RequestedAppointmentDate];
Ответ №2:
Возможно, вам придется дважды объединить таблицу страховщиков с назначениями, если вы хотите убедиться, что выбираете только те встречи, в которых есть оба страховщика
SELECT
TOP (1000) A.[Id] ,
A.[AppointmentTypeId] ,
A.[AssignmentId] ,
A.[StaffId] ,
A.[CalendarId] ,
A.[AppointmentDate] ,
A.[ScheduledDate] ,
A.[RequestedAppointmentDate] ,
A.[Notes] ,
A.[Hour] ,
A.[Minute] ,
A.[DayOfTheWeek] ,
A.[CenterId] ,
A.[AppointmentStatusId] ,
A.[RentalCar] ,
A.[ScheduledBy] ,
I1.Name,
I2.Name
FROM
[AssignmentManagement].[dbo].[Appointments] A
left join
[AssignmentManagement].[dbo].[Insurers] I1
on A.StaffId = I1.Id
and I1.Name = 'State Farm'
left join
[AssignmentManagement].[dbo].[Insurers] I2
on A.StaffId = I2.Id
and I2.Name = 'USAA'
where
I1.Name is not NULL
and I2.Name is not NULL