【问题标题】:How to merge two select queries resulting one table如何合并两个选择查询产生一个表
【发布时间】:2011-04-01 14:38:39
【问题描述】:

嗨 我有两个选择查询,我想将它们合并到一个具有 5 列的单个表中 Id, ClientId, Height, EyeColor, HairColor

查询是:

SELECT ClientCharacteristic.Id
     , ClientCharacteristic.ClientId
     , ClientCharacteristic.Height
     , GeneralLookup.LookupItem as EyeColor  
FROM dbo.ClientCharacteristic
  INNER JOIN dbo.GeneralLookup
    ON GeneralLookup.Id=ClientCharacteristic.glEyeColorId 



SELECT ClientCharacteristic.Id
     , ClientCharacteristic.ClientId
     , ClientCharacteristic.Height
     , GeneralLookup.LookupItem as HairColor  
FROM dbo.ClientCharacteristic
  INNER JOIN dbo.GeneralLookup
    ON GeneralLookup.Id=ClientCharacteristic.glHairColorId

【问题讨论】:

    标签: asp.net sql merge


    【解决方案1】:

    通常,您会使用UNION 来“合并”查询。 但是,在这种特殊情况下,这将导致在其他重复行中包含 EyeColorHairColor 的单个列。我怀疑这就是您想要的。更好的方法可能是为您的连接表添加别名,以便您可以将其连接两次:

    SELECT
      ClientCharacteristic.Id,
      ClientCharacteristic.ClientId, 
      ClientCharacteristic.Height,
      EyeLookup.LookupItem as EyeColor,
      HairLookup.LookupItem as HairColor
    FROM
      dbo.ClientCharacteristic
      INNER JOIN dbo.GeneralLookup AS EyeLookup
        ON EyeLookup.Id=ClientCharacteristic.glEyeColorId
      INNER JOIN dbo.GeneralLookup AS HairLookup
        ON HairLookup.Id=ClientCharacteristic.glHairColorId
    

    这里要注意的关键是INNER JOIN 子句中的AS 子句,它为连接表的其余部分设置别名。这允许您在不同的键上多次连接同一个表,以便为不同的目的引用它。

    【讨论】:

      【解决方案2】:

      unionunion all 应该这样做,只要列对齐并且类型相同(或可以隐式转换)

      遵循 Davids Advice 并重新阅读问题 5 列将是

      SELECT ClientCharacteristic.Id, 
             ClientCharacteristic.ClientId,  
             ClientCharacteristic.Height, 
             Eye.LookupItem as EyeColor
             Hair.LookupItem AS HairColor
      FROM 
          dbo.ClientCharacteristic 
      INNER JOIN 
          dbo.GeneralLookup Eye
          ON  Eye.Id=ClientCharacteristic.glEyeColorId     
      INNER JOIN
          dbo.GeneralLookup Hair
          ON Hair.Id=ClientCharacteristic.glHairColorId 
      

      【讨论】:

      • 类型可能会被隐式转换,但我怀疑“HairColor”和“EyeColor”应该是软件中任何商业目的的单列。
      【解决方案3】:

      您可以使用UNION 将两个查询合并为一个。

      【讨论】:

      • 这是一种笼统的说法。 UNION 将如何处理这两个查询中HairColorEyeColor 之间的差异?
      • @David:对不起,你是对的——我忽略了问题的细节!为您的回答 +1。
      【解决方案4】:
      SELECT ClientCharacteristic.Id, ClientCharacteristic.ClientId, ClientCharacteristic.Height, GeneralLookup.LookupItem as EyeColor, '' as HairColor    
      FROM dbo.ClientCharacteristic INNER JOIN dbo.GeneralLookup ON GeneralLookup.Id=ClientCharacteristic.glEyeColorId
      UNION
      SELECT ClientCharacteristic.Id, ClientCharacteristic.ClientId, ClientCharacteristic.Height, '' as EyeColor, GeneralLookup.LookupItem as HairColor    
      FROM dbo.ClientCharacteristic INNER JOIN dbo.GeneralLookup ON GeneralLookup.Id=ClientCharacteristic.glHairColorId
      

      【讨论】:

      • 您将如何解决 HairColorEyeColor 被合并为单个列跨越其他重复行的事实?
      • 我虽然是合并它们。已经修复了查询以将它们放在不同的行中
      • 所以数据中的每个“人”都会有两个结果行,一个是他们的头发颜色和一个空的眼睛颜色,一个是他们的眼睛颜色和一个空的头发颜色?这可能不会很直观......
      • 还是不太好。这将为每个Id 提供两行,其中一行包含头发颜色为 NULL 的眼睛颜色,另一行包含眼睛颜色为 NULL 的头发颜色。诚然,就“合并”的含义而言,这个问题的表述并不好,但是由于两个查询都从ClientCharacteristic 中提取了大部分列,因此目标似乎很可能是每个Id 的一行,其中包括头发颜色和眼睛的颜色。
      • @David 和@Dave Costa 很好,我第一次读到这个问题时,我的想法是(错误的)@asma 想要的是一个工会。毫无疑问,@David 的解决方案似乎要好得多。
      【解决方案5】:

      您可以像这样使用 de UNION 运算符:

      SELECT ClientCharacteristic.Id, ClientCharacteristic.ClientId, ClientCharacteristic.Height, GeneralLookup.LookupItem as EyeColor
      FROM dbo.ClientCharacteristic INNER JOIN dbo.GeneralLookup ON GeneralLookup.Id=ClientCharacteristic.glEyeColorId
      UNION
      SELECT ClientCharacteristic.Id, ClientCharacteristic.ClientId, ClientCharacteristic.Height, GeneralLookup.LookupItem as HairColor
      FROM dbo.ClientCharacteristic INNER JOIN dbo.GeneralLookup ON GeneralLookup.Id=ClientCharacteristic.glHairColorId
      

      请注意,UNION 运算符会丢弃重复的元组。要在结果表中保留重复值,请使用 UNION ALL

      【讨论】:

      • 联合连接行,而不是列
      猜你喜欢
      • 2017-08-17
      • 2016-07-26
      • 2012-07-18
      • 1970-01-01
      • 2013-02-17
      • 2013-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多