【问题标题】:Combining two SQL queries into one tidy table将两个 SQL 查询组合成一张整洁的表
【发布时间】:2017-07-24 00:37:09
【问题描述】:

首先让我说我是一个初学者,所以请随意使查询看起来更好,因为你认为合适。无论如何,我在尝试合并所有两个查询时遇到了麻烦,我认为这比尝试将两者合并到一个表中更容易。我尝试了一个联合,但这只是从第一个查询中返回列。我想要完成的是通过使用 TrainProgram 将第一个查询与第二个查询连接起来。 UserLastName 是我真正需要的一列,但它不知道通过。任何帮助将不胜感激。谢谢。这是第一个查询:

select 
    aa.TrainProgramID
  , aa.TrainProgram_OrganizationalUnitName
  , aa.TrainProgramMetaDataTypeName
  , aa.TrainProgramName
  , a.Activity_Name
  , a.Activity_Duration
  , a.Activity_UpdateDate
  , i.EntityName        as [MPN]
  , a.Activity_TypeName as [Activity_MDT]
  , g.Activity_ID
  , a.Activity_Description
  , a.ActivityPar_SNa  as [ActivitySName]
  , a.Activity_Order
  , a.ActivityPar_SID  as [ActivitySID]
from rawViews.MCD_DH_Activities a
  left join rawViews.MCD_DH_TrainingProgramsBasicData aa
    on a.Activity_EntityID = aa.TrainingProgramID
  inner join dh.MCD_DH_Activities g
    on g.Activity_ID = a.Activity_ID
  full join rawViews.MCD_DH_ActivityPrerequisites h
    on h.ActivityID = a.Activity_ID
  left join dh.MCD_DH_BaseEntities i
    on a.Activity_EntityID = i.EntityID
where a.Activity_VersionStatusID = 1

这是我的第二个查询:

select 
    b.TrainProgramID
  , c.uid
  , c.UserLastName
from dh.MCD_DH_UserTrainProAssoc a
  inner join rawViews.MCD_DH_TrainProgramsBasicData b
    on a.TrainProgramID = b.TrainProgramID
  inner join rawViews.MCD_DH_UBasicData c
    on a.uid = c.uid

【问题讨论】:

标签: sql sql-server sql-server-2008 reporting-services


【解决方案1】:

我想这就是你要找的:

select 
    aa.TrainProgramID
  , aa.TrainProgram_OrganizationalUnitName
  , aa.TrainProgramMetaDataTypeName
  , aa.TrainProgramName
  , c.uid
  , c.UserLastName
  , a.Activity_Name
  , a.Activity_Duration
  , a.Activity_UpdateDate
  , i.EntityName        as [MPN]
  , a.Activity_TypeName as [Activity_MDT]
  , g.Activity_ID
  , a.Activity_Description
  , a.ActivityPar_SNa  as [ActivitySName]
  , a.Activity_Order
  , a.ActivityPar_SID  as [ActivitySID]
from rawViews.MCD_DH_Activities a
  left join rawViews.MCD_DH_TrainingProgramsBasicData aa
    on a.Activity_EntityID = aa.TrainingProgramID
  left join dh.MCD_DH_UserTrainProAssoc utpa
    on aa.TrainProgramID = utpa.TrainProgramID
  left join rawViews.MCD_DH_UBasicData c
    on utpa.uid = c.uid
  inner join dh.MCD_DH_Activities g
    on g.Activity_ID = a.Activity_ID
  full join rawViews.MCD_DH_ActivityPrerequisites h
    on h.ActivityID = a.Activity_ID
  left join dh.MCD_DH_BaseEntities i
    on a.Activity_EntityID = i.EntityID
where a.Activity_VersionStatusID = 1

【讨论】:

  • 谢谢!这就说得通了。 :)
  • @BoyGeorge 乐于助人!
  • @SQLZim 像这样混合内部和外部联接可能会导致一些数据意外。在内连接之前的左连接很可能会变成内连接。由于 G 正在加入 A,因此最好将其作为查询中的第一个联接。从内部连接 ​​g 到 g = a 左连接 aa 在 a = aa 左连接 utpa 在 aa = utpa 左连接 c 在 utpa = c 左连接 i 在 a = i FULL 连接 h 在 h = a
  • @WesH 您的关注在某些情况下是有效的,但不适用于这种情况: 1)查询没有使用force order 提示; 2) 查询不是Forcing Join Order Without Hints - Erik Darling 3) 连接条件只引用它们自己和另一个表之间的相等性,并且不要在主表连接的不同分支内混合连接。请看ypercubeᵀᴹ's answer to Does the join order matter in SQL?
猜你喜欢
  • 1970-01-01
  • 2015-10-08
  • 1970-01-01
  • 1970-01-01
  • 2012-11-05
  • 2018-08-07
  • 2021-11-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多