繁体   English   中英

合并SQL中的选择语句

[英]Merge Select Statements in SQL

我有2个选择语句,但我需要合并两个结果,并在SECONDARY_MATERIAL列旁边显示PRIMARY_MATERIAL 我目前正在使用UNION,它显示行中的所有内容(大约300行),但我真的只需要150行,并希望它显示在额外的列中。

SELECT RM_Materials.MaterialCode MatCode,
       RM_MRPAttributeDefinitions.ShortDescription ProcessArea,
       RM_MRPAttributes.AttributeValue AttValue
FROM   DMI_Manu32.dbo.RM_MRPAttributeDefinitions
       INNER JOIN (DMI_Manu32.dbo.RM_Materials
                   INNER JOIN DMI_Manu32.dbo.RM_MRPAttributes
                           ON (RM_Materials.MaterialUID = RM_MRPAttributes.MaterialUID)
                              AND (RM_Materials.InternalVersionNo = RM_MRPAttributes.MaterialVersionNo))
               ON RM_MRPAttributeDefinitions.MRPAttributeDefinitionsUID = RM_MRPAttributes.MRPAttributeDefinitionsUID
WHERE  RM_Materials.ActiveTF = 1
       AND RM_MRPAttributes.ActiveTF = 1
       AND "RM_MRPAttributeDefinitions"."ActiveTF" = 1
       AND "RM_Materials"."DeletedTF" = 0
       AND "RM_MRPAttributeDefinitions"."ShortDescription" = N'PRIMARY_MATERIAL'
       AND "RM_Materials".ActiveTF = 1
UNION
SELECT RM_Materials.MaterialCode MatCode,
       RM_MRPAttributeDefinitions.ShortDescription ProcessArea,
       RM_MRPAttributes.AttributeValue AttValue
FROM   DMI_Manu32.dbo.RM_MRPAttributeDefinitions
       INNER JOIN (DMI_Manu32.dbo.RM_Materials
                   INNER JOIN DMI_Manu32.dbo.RM_MRPAttributes
                           ON (RM_Materials.MaterialUID = RM_MRPAttributes.MaterialUID)
                              AND (RM_Materials.InternalVersionNo = RM_MRPAttributes.MaterialVersionNo))
               ON RM_MRPAttributeDefinitions.MRPAttributeDefinitionsUID = RM_MRPAttributes.MRPAttributeDefinitionsUID
WHERE  RM_Materials.ActiveTF = 1
       AND RM_MRPAttributes.ActiveTF = 1
       AND "RM_MRPAttributeDefinitions"."ActiveTF" = 1
       AND "RM_Materials"."DeletedTF" = 0
       AND "RM_MRPAttributeDefinitions"."ShortDescription" = N'SECONDARY_MATERIAL'
       AND "RM_Materials".ActiveTF = 1

我认为条件聚合会做你想要的。 但是,您的查询很难遵循。 我认为这是解决方案:

SELECT m.MaterialCode as MatCode,
       d.ShortDescription as ProcessArea, 
       MAX(CASE WHEN ShortDescription = N'PRIMARY_MATERIAL' THEN a.AttributeValue 
           END) as PrimaryMaterial_AttValue,
       MAX(CASE WHEN ShortDescription = N'SECONDARY_MATERIAL' THEN a.AttributeValue 
           END) as SecondaryMaterial_AttValue 
FROM DMI_Manu32.dbo.RM_Materials m INNER JOIN
     DMI_Manu32.dbo.RM_MRPAttributes a
     ON m.MaterialUID = a.MaterialUID AND m.InternalVersionNo = a.MaterialVersionNo INNER JOIN
     DMI_Manu32.dbo.RM_MRPAttributeDefinitions d
     ON d.MRPAttributeDefinitionsUID = a.MRPAttributeDefinitionsUID
WHERE m.ActiveTF = 1 AND a.ActiveTF = 1 AND
      d.ActiveTF = 1 AND
      m.DeletedTF = 0
GROUP BY m.MaterialCode, d.ShortDescription;

笔记:

  • 表别名使查询更容易阅读和编写。
  • 通常,不需要FROM子句中的括号。 而且,通过INNER JOIN ,他们永远不需要。 括号通常会引起混淆。
  • 不需要在WHERE子句中重复条件(例如"RM_Materials".ActiveTF=1 )。

只需一个查询:

AND "RM_MRPAttributeDefinitions"."ShortDescription" IN (N'PRIMARY_MATERIAL',N'SECONDARY_MATERIAL' )

认为这可能会给你你想要的东西

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM