Запрос для получения данных из двух таблиц и возврата их вместе

#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