【问题标题】:SQL joining 6 tablesSQL连接6个表
【发布时间】:2011-10-09 23:04:40
【问题描述】:

请看一下图片。有 5 个表与指定 ID 的指定表相关。 现在我需要所有具有相同约会 id 的数据。加入查询应该是什么?有人可以帮我吗?

这是生成的查询(我使用的是左外连接)

SELECT     dbo.Appointment.appointment_id, dbo.Appointment.patient_id, dbo.PatientInvestigaiton.investigation_name, dbo.PatientInvestigaiton.investigation_id, 
           dbo.PatientTreatmentMedicine.medecine_id, dbo.PatientTreatmentMedicine.medicinename, dbo.PatientTreatmentMedicine.medicinetype, 
           dbo.PatientFindings.finding_id, dbo.PatientFindings.finding_value, dbo.PatientAdvice.advice_description, dbo.PatientCC.cc_value, dbo.PatientCC.cc_id, 
           dbo.PatientDiagonosis.diagonosis_name, dbo.PatientDiagonosis.diagonosis_id

FROM       dbo.Appointment LEFT OUTER JOIN

           dbo.PatientInvestigaiton ON dbo.Appointment.appointment_id = dbo.PatientInvestigaiton.appointment_id LEFT OUTER JOIN
           dbo.PatientTreatmentMedicine ON dbo.Appointment.appointment_id = dbo.PatientTreatmentMedicine.appointment_id LEFT OUTER JOIN
           dbo.PatientFindings ON dbo.Appointment.appointment_id = dbo.PatientFindings.appointment_id LEFT OUTER JOIN
           dbo.PatientDiagonosis ON dbo.Appointment.appointment_id = dbo.PatientDiagonosis.appointment_id LEFT OUTER JOIN
           dbo.PatientCC ON dbo.Appointment.appointment_id = dbo.PatientCC.appointment_id LEFT OUTER JOIN
           dbo.PatientAdvice ON dbo.Appointment.appointment_id = dbo.PatientAdvice.appointment_id

           where dbo.Appointment.appointment_id='46';

【问题讨论】:

  • 复制并粘贴显示在您问题图像上的选择查询。
  • 视图构建器在底部为您生成查询。所有JOIN 都会在那里。

标签: sql sql-server-2008 join


【解决方案1】:

由于appointmnent_idAppointment的主键,所以该表与所有6个表都有1:N关系。

在这种情况下,加入这 6 个表会产生具有重复数据的多行,就像Cartesian Product。例如如果(只针对一个id=46),则有:

  • PatientInvestigation 3 行
  • PatientTreatmentMedicine 为 6 行
  • PatientFindings 为 4 行
  • PatientDiagnosis 2 行
  • PatientCC 2 行
  • PatientAdvice 为 5 行

您将在结果集中获得 3x6x4x2x2x5 = 1440 行,而您只需要 3+6+4+2+2+5 (+1) = @987654333 @ 行。这比所需的行数多 60 倍(并且列数更多)。

最好在每个查询中使用一个 JOIN 到一个(6 个)表中的一个(以及另一个查询以从基表 Appointment 获取数据)执行 6 个单独的查询。并在应用程序代码中组合 6 个查询的结果。基本查询和要连接到第一个表的查询的示例:

基表

SELECT 
    a.appointment_id, 
    a.patient_id
FROM 
    Appointment AS a
WHERE
    a.appointment_id = 46

Join-1 到 PatientInvestigation

SELECT 
    pi.investigation_name, 
    pi.investigation_id
FROM 
    Appointment AS a
      JOIN
    PatientInvestigation AS pi
        ON pi.appointment_id = a.appointment_id
WHERE
    a.appointment_id = 46

【讨论】:

  • 我可以为这种方法做一个视图吗?那会怎么样?
  • 如果你想要查看,你必须创建 6(+1) 个视图。为什么需要视图?
【解决方案2】:
SELECT 
    Appointment.appointment_id, 
    Appointment.patient_id, 
    PatientInvestigaiton.investigation_name, 
    PatientInvestigaiton.investigation_id, 
    PatientTreatmentMedicine.medecine_id, 
    PatientTreatmentMedicine.medicinename, 
    PatientTreatmentMedicine.medicinetype, 
    PatientFindings.finding_id, 
    PatientFindings.finding_value, 
    PatientAdvice.advice_description, 
    PatientCC.cc_value, 
    PatientCC.cc_id, 
    PatientDiagonosis.diagonosis_name, 
    PatientDiagonosis.diagonosis_id
FROM 
    Appointment 
    LEFT OUTER JOIN PatientInvestigaiton     ON Appointment.appointment_id = PatientInvestigaiton.appointment_id AND Appointment.appointment_id='46'
    LEFT OUTER JOIN PatientTreatmentMedicine ON Appointment.appointment_id = PatientTreatmentMedicine.appointment_id 
    LEFT OUTER JOIN PatientFindings          ON Appointment.appointment_id = PatientFindings.appointment_id 
    LEFT OUTER JOIN PatientDiagonosis        ON Appointment.appointment_id = PatientDiagonosis.appointment_id 
    LEFT OUTER JOIN PatientCC                ON Appointment.appointment_id = PatientCC.appointment_id 
    LEFT OUTER JOIN PatientAdvice            ON Appointment.appointment_id = PatientAdvice.appointment_id

【讨论】:

    【解决方案3】:
    SELECT {TABLE1}.appointment_id,{OTHER FIELDS} FROM {TABLE1}
        JOIN {TABLE2} ON {TABLE1}.appointment_id = {TABLE2}.appointment_id
        JOIN {TABLE3} ON {TABLE1}.appointment_id = {TABLE3}.appointment_id
        JOIN {TABLE4} ON {TABLE1}.appointment_id = {TABLE4}.appointment_id
        JOIN {TABLE5} ON {TABLE1}.appointment_id = {TABLE5}.appointment_id
        JOIN {TABLE6} ON {TABLE1}.appointment_id = {TABLE6}.appointment_id
        JOIN {TABLE7} ON {TABLE1}.appointment_id = {TABLE7}.appointment_id
        JOIN {TABLE8} ON {TABLE1}.appointment_id = {TABLE8}.appointment_id;
    

    试试这个:

    SELECT
        dbo.Appointment.appointment_id, dbo.Appointment.patient_id,
        dbo.PatientInvestigaiton.investigation_name, dbo.PatientInvestigaiton.investigation_id, 
        dbo.PatientTreatmentMedicine.medecine_id, dbo.PatientTreatmentMedicine.medicinename, dbo.PatientTreatmentMedicine.medicinetype,
        dbo.PatientFindings.finding_id, dbo.PatientFindings.finding_value,
        dbo.PatientAdvice.advice_description,
        dbo.PatientCC.cc_value, dbo.PatientCC.cc_id,
        dbo.PatientDiagonosis.diagonosis_name, dbo.PatientDiagonosis.diagonosis_id
    FROM
        dbo.Appointment 
        LEFT JOIN dbo.PatientInvestigaiton
            ON dbo.Appointment.appointment_id = dbo.PatientInvestigaiton.appointment_id
        LEFT JOIN dbo.PatientTreatmentMedicine
            ON dbo.Appointment.appointment_id = dbo.PatientTreatmentMedicine.appointment_id
        LEFT JOIN dbo.PatientFindings
            ON dbo.Appointment.appointment_id = dbo.PatientFindings.appointment_id
        LEFT JOIN dbo.PatientDiagonosis
            ON dbo.Appointment.appointment_id = dbo.PatientDiagonosis.appointment_id
        LEFT JOIN dbo.PatientCC
            ON dbo.Appointment.appointment_id = dbo.PatientCC.appointment_id
        LEFT JOIN dbo.PatientAdvice
            ON dbo.Appointment.appointment_id = dbo.PatientAdvice.appointment_id
    WHERE
        dbo.Appointment.appointment_id='46';
    

    【讨论】:

    • 复制并粘贴您问题中图像上显示的选择查询,以便我可以根据需要进行修改。
    • 请看一下我在主帖中更新的查询..加入后我得到了多个数据...可以吗?
    • OK..效果很好..现在我有了视图...告诉我如何查询此视图以获取列的数据..就像我想从适用于 ID 46 任命的视图
    • 他正在从表中选择数据...我不想要那个...告诉我如何查询视图...你明白了吗?
    猜你喜欢
    • 2015-11-04
    • 1970-01-01
    • 2020-10-11
    • 2012-02-28
    • 2012-05-01
    • 2012-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多