【问题标题】:how to view the only one record based on primary key?如何根据主键查看唯一的一条记录?
【发布时间】:2018-04-06 07:11:01
【问题描述】:

注册表我插入了一条记录,primaryID 是DoctorID

SELECT TOP 1000 [DoctorID]
      ,[DoctorSource]
      ,[Tittle]
      ,[DoctorName]
      ,[DoctorCode]
      ,[RegistrationNo]
      ,[Gender]
      ,[DocDOB]
      ,[DocAddress1]
      ,[DocAddress2]
      ,[Country]
      ,[State]
      ,[City]
      ,[Pincode]
      ,[CountryCode]
      ,[Mobile]
      ,[Phone]
      ,[Email]
      ,[Website]
      ,[AadhaarCardNo]
      ,[Language]
      ,[AboutDoctor]
      ,[Status]
      ,[IPAddress]
      ,[Latitude]
      ,[Longitude]
      ,[CreatedBy]
      ,[CreatedDate]
      ,[ModifiedBy]
      ,[ModifiedDate]
  FROM [VAN_DOCTOR].[dbo].[DoctorRegistration]

基于DoctorID,我们在经验表中插入两条记录,主键为ExperienceID,参考键为DoctorID

SELECT TOP 1000 [ExperienceID]
      ,[DoctorID]
      ,[HospitalName]
      ,[Department]
      ,[Designation]
      ,[FromDate]
      ,[ToDate]
      ,[WorkDescription]
      ,[CreatedBy]
      ,[CreatedDate]
      ,[ModifiedBy]
      ,[ModifiedDate]
  FROM [VAN_DOCTOR].[dbo].[Doctorexperience]

在我的视图页面中显示了两条记录,但我们只有一条 doctorID 所以

我只需要查看一条记录如何解决这个问题

USE [VAN_DOCTOR]
GO
/****** Object:  StoredProcedure [dbo].[GetFullDoctorMEDEIL]    Script Date: 25-Oct-17 2:18:08 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER Procedure [dbo].[GetFullDoctorMEDEIL]  
as  
begin  
   select 

        DR.[DoctorID],
        DR.[DoctorSource],
        DR.[Tittle],
        DR.[DoctorName],
        DR.[DoctorCode],
        DR.[RegistrationNo],
        DR.[Gender],
        DR.[DocDOB],
        DR.[DocAddress1],
        DR.[DocAddress2],
        C.CountryName,
        S.StateName,
        DR.[City],
        DR.[Pincode],
        C.CountryCode + C.DialingCode As Countrydial,
        DR.[Mobile],
        DR.[Phone],
        DR.[Email],
        DR.[Website],
        DR.[AadhaarCardNo],
        DR.[Language],
        DR.[AboutDoctor],
        DR.[Status],

        DEX.[ExperienceID],
        DEX.[HospitalName],
        DEX.[Department],
        DEX.[Designation],
        DEX.[FromDate],
        DEX.[ToDate],
        DEX.[WorkDescription],

        DE.[DoctorEducationID],
        DE.[Qualification],
        DE.[Major],
        DE.[YearOfPassing],
        DE.[Institute],

        DC.[DoctorinformationID],
        DC.[CHospitalName],
        DC.[Address1],
        DC.[Address2],
        CD.CountryName,
        SD.StateName,
        DC.[CCity],
        DC.[CPincode],
        DC.[DoctorRoomNo],
        DC.[Consultingfees],
        SY.SpecialityName,
        CY.SpecialistName,

        DB.[BusinessDaysID],
        DB.[Sunday],
        DB.[Monday],
        DB.[Tuesday],
        DB.[Wednesday],
        DB.[Thursday],
        DB.[Friday],
        DB.[Saturday],
        DB.[SunStartTime],
        DB.[SunEndTime],
        DB.[MonStartTime],
        DB.[MonEndTime],
        DB.[TueStartTime],
        DB.[TueEndTime],
        DB.[WedStartTime],
        DB.[WedEndTime],
        DB.[ThuStartTime],
        DB.[ThuEndTime],
        DB.[FriStartTime],
        DB.[FriEndTime],
        DB.[SatStartTime],
        DB.[SatEndTime],

        DS.[DoctorSocialID],
        DS.[FaceBookID],
        DS.[TwitterID],
        DS.[linkedinID],
        DS.[PinterestID],
        DS.[GooglePlusID],


        DR.[CreatedDate]




        from DoctorRegistration AS DR


        LEFT JOIN [VAN_SETTING].[dbo].[Country] C ON C.CountryID=DR.Country
        LEFT JOIN [VAN_SETTING].[dbo].[State] S ON S.StateID=DR.State
        LEFT JOIN [dbo].[Doctorexperience] as DEX ON DEX.DoctorID=DR.DoctorID
        LEFT JOIN [dbo].[DoctorEducation] as DE ON DE.DoctorID=DR.DoctorID
        LEFT JOIN [dbo].[DoctorclinicInformation] as DC ON DC.DoctorID=DR.DoctorID

        LEFT JOIN [VAN_SETTING].[dbo].[Country] CD ON CD.CountryID=DC.CCountry
        LEFT JOIN [VAN_SETTING].[dbo].[State] SD ON SD.StateID=DC.CState

        LEFT JOIN [VAN_SETTING].[dbo].[Specialist] CY ON CY.SpecialistID=DC.SpecialistID
        LEFT JOIN [VAN_SETTING].[dbo].[Speciality] SY ON SY.SpecialityID=DC.SpecialityID

        LEFT JOIN [dbo].[ClinicBusinessHour] as DB ON DB.DoctorID=DR.DoctorID

        LEFT JOIN [dbo].[Doctorsocialnetwork] as DS ON DS.DoctorID=DR.DoctorID


End

【问题讨论】:

  • 为什么是C# 标签?这是一个错误吗?
  • 没有先生,我删除了对不起先生@Equalsk
  • IMO 的问题太长了。你能把它削减一点吗?
  • 但是为什么应该显示阿波罗医院而不是米洛特?为什么这是正确的记录,而 Milot 不正确?
  • 我理解这个问题。您有两条记录并且只想要一条,这不是一个困难的概念,但是您需要一种选择其中一条的方法,可以是按字母顺序排列的第一个,也可以是最早的时间等。我只是问您如何决定两者中的哪一个要显示的记录。

标签: sql sql-server asp.net-mvc sql-server-2008


【解决方案1】:

那是因为您有多个具有相同 DoctorId 的记录,如果我看到带有 JOIN 的最终查询结果,则结果记录都是相同的,在这种情况下,您可能可以使用 distinct 之类的

   select distinct
        DR.[DoctorID],
        DR.[DoctorSource],
        DR.[Tittle],
        DR.[DoctorName],

您也可以使用ROW_NUMBER() 分析函数从这些重复项中仅获取一条记录

select * from (
   select 
        DR.[DoctorID],
        DR.[DoctorSource],
        DR.[Tittle],
        DR.[DoctorName],
        DR.[DoctorCode],
        DR.[RegistrationNo],
        DR.[Gender],
        DR.[DocDOB],
        DR.[DocAddress1],
        DR.[DocAddress2],
        C.CountryName,
        S.StateName,
        DR.[City],
        DR.[Pincode],
        C.CountryCode + C.DialingCode As Countrydial,
        DR.[Mobile],
        DR.[Phone],
        DR.[Email],
        DR.[Website],
        DR.[AadhaarCardNo],
        DR.[Language],
        DR.[AboutDoctor],
        DR.[Status],

        DEX.[ExperienceID],
        DEX.[HospitalName],
        DEX.[Department],
        DEX.[Designation],
        DEX.[FromDate],
        DEX.[ToDate],
        DEX.[WorkDescription],

        DE.[DoctorEducationID],
        DE.[Qualification],
        DE.[Major],
        DE.[YearOfPassing],
        DE.[Institute],

        DC.[DoctorinformationID],
        DC.[CHospitalName],
        DC.[Address1],
        DC.[Address2],
        CD.CountryName,
        SD.StateName,
        DC.[CCity],
        DC.[CPincode],
        DC.[DoctorRoomNo],
        DC.[Consultingfees],
        SY.SpecialityName,
        CY.SpecialistName,

        DB.[BusinessDaysID],
        DB.[Sunday],
        DB.[Monday],
        DB.[Tuesday],
        DB.[Wednesday],
        DB.[Thursday],
        DB.[Friday],
        DB.[Saturday],
        DB.[SunStartTime],
        DB.[SunEndTime],
        DB.[MonStartTime],
        DB.[MonEndTime],
        DB.[TueStartTime],
        DB.[TueEndTime],
        DB.[WedStartTime],
        DB.[WedEndTime],
        DB.[ThuStartTime],
        DB.[ThuEndTime],
        DB.[FriStartTime],
        DB.[FriEndTime],
        DB.[SatStartTime],
        DB.[SatEndTime],

        DS.[DoctorSocialID],
        DS.[FaceBookID],
        DS.[TwitterID],
        DS.[linkedinID],
        DS.[PinterestID],
        DS.[GooglePlusID],

        DR.[CreatedDate],
        ROW_NUMBER() OVER(PARTITION BY DR.[DoctorID] ORDER BY DR.[DoctorID]) as rn



        from DoctorRegistration AS DR


        LEFT JOIN [VAN_SETTING].[dbo].[Country] C ON C.CountryID=DR.Country
        LEFT JOIN [VAN_SETTING].[dbo].[State] S ON S.StateID=DR.State
        LEFT JOIN [dbo].[Doctorexperience] as DEX ON DEX.DoctorID=DR.DoctorID
        LEFT JOIN [dbo].[DoctorEducation] as DE ON DE.DoctorID=DR.DoctorID
        LEFT JOIN [dbo].[DoctorclinicInformation] as DC ON DC.DoctorID=DR.DoctorID

        LEFT JOIN [VAN_SETTING].[dbo].[Country] CD ON CD.CountryID=DC.CCountry
        LEFT JOIN [VAN_SETTING].[dbo].[State] SD ON SD.StateID=DC.CState

        LEFT JOIN [VAN_SETTING].[dbo].[Specialist] CY ON CY.SpecialistID=DC.SpecialistID
        LEFT JOIN [VAN_SETTING].[dbo].[Speciality] SY ON SY.SpecialityID=DC.SpecialityID

        LEFT JOIN [dbo].[ClinicBusinessHour] as DB ON DB.DoctorID=DR.DoctorID

        LEFT JOIN [dbo].[Doctorsocialnetwork] as DS ON DS.DoctorID=DR.DoctorID ) tt
where rn = 1;

【讨论】:

  • 我是这项技术的新手,请先生帮助我@Rahul
  • 在仪表板中我只需要显示一条记录,但详细信息页面需要查看阿波罗医院和米洛特医院@Rahul 的所有信息
  • @IvinRaj,在仪表板中我只需要显示一条记录 ...您要显示的一条记录是什么。在你的帖子中澄清这一点
  • 那么您需要一个来自DoctorRegistration 的查询作为仪表板,然后您使用另一个(两条记录)查询来列出详细信息页面中的所有信息。或者您使用返回两条记录的查询,并且只在摘要中显示第一条记录。请注意,在您的示例中,图片只显示一条记录!
  • 对于ibb.co/hdAy5m.. 的图片,您需要使用从DoctorRegistration 中选择just。您不应该加入其他表。
【解决方案2】:

如果您加入 Doctorexperience,您将拥有与此表一样多的记录。如果 DoctorRegistration 中有 1 条记录,Doctorexperience 中有 5 条记录,您将获得 5 条加入记录。 Distinct 无济于事,因为您从 Doctorexperience 获得 ExperienceID 列,它是主键。也许您只需要 Doctorexperience 的第一条记录,这样您就可以做类似的事情,而不是加入 Doctorexperience:

OUTER APPLY 
(
  select top 1 DEX.ExperienceID, ... from [dbo].[Doctorexperience]  DEX
   where DEX.DoctorID=DR.DoctorID
) EXTOP

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多