查询合并3个表SQL SERVER

时间:2017-07-21 17:40:39

标签: sql-server sql-server-2012 case inner-join

我有一个表中的项目列表。这些项目可以是两种类型' A'或者' M'

表1

Retry

我需要另一列来显示计量单位(UoM)。此列位于两个不同的表中。如果项目是类型M,UoM位于表A中,另一方面如果是类型A,则UoM位于表B中。

表A

---------------------------------------------------------
|  Code  |  Type  |  Description  |  Quantity  |  Cost  |
|-------------------------------------------------------|
|BAG001_M|   M    | Some text here|     2.0    |  40.0  |
|BAG002_M|   M    | Some text here|     5.0    |  69.0  |
|CAY003_M|   A    | Some text here|     8.0    |  10.0  |
|CFI002_M|   M    | Some text here|     8.0    |  10.0  |
--------------------------------------------------------

表B

-----------------------------------------------
|  Code  |  Description  |  Currency  |  UoM  |
|----------------------------------------------
|BAG001_M| Some text here|     MXN    |   m2  |
|BAG002_M| Some text here|     USD    |   lt  |
|CFI002_M| Some text here|     MXN    |   m3  |
-----------------------------------------------

我需要这样的东西。

-----------------------------------------------
|  Code  |  Description  |  Currency  |  UoM  |
|----------------------------------------------
|CAY003_M| Some text here|     USD    |   kg  |
-----------------------------------------------

有一个小问题。可能有2个具有相同代码但具有不同类型的项目,因此它们可能具有另一个UoM。例如。

-----------------------------------------------------------------
|  Code  |  Type  |  Description  |  Quantity  |  Cost  |  UoM  |
|---------------------------------------------------------------|
|BAG001_M|   M    | Some text here|     2.0    |  40.0  |  m2   |
|BAG002_M|   M    | Some text here|     5.0    |  69.0  |  lt   |
|CAY003_M|   A    | Some text here|     8.0    |  10.0  |  kg   |
|CFI002_M|   M    | Some text here|     8.0    |  10.0  |  m3   |
-----------------------------------------------------------------

我正在使用SQL Server 2012,我尝试了以下代码。它与第一个内部连接一起工作,所以我试图添加另一个,但似乎这不是这样做的方式。

-----------------------------------------------------------------
|  Code  |  Type  |  Description  |  Quantity  |  Cost  |  UoM  |
|---------------------------------------------------------------|
|AAA001_M|   M    | Some text here|     2.0    |  40.0  |  m2   |
|AAA001_M|   A    | Some text here|     5.0    |  20.0  |  lt   |
-----------------------------------------------------------------

有人可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

以下是使用两个Left Join s:

执行此操作的方法
Select      AD.CODE,
            AD.Type,
            AD.DESCRIPTION,
            AD.QUANTITY,
            AD.[COSTS],
            Coalesce(A.UOM, B.UOM) As UOM
From        Table1  AD
Left Join   TableA  A   On  A.Code = AD.Code
                        And AD.Code = 'M'
Left Join   TableB  B   On  B.Code = AD.Code
                        And AD.Code = 'A'

Coalesce()将从两个结果中选择第一个非NULL值。

如果某个项目包含多个代码且您需要两个结果,则可以使用UNION ALL代替:

Select  AD.CODE,
        AD.Type,
        AD.DESCRIPTION,
        AD.QUANTITY,
        AD.[COSTS],
        A.UOM
From    Table1  AD
Join    TableA  A   On  A.Code = AD.Code
Where   AD.Code = 'M'
Union All
Select  AD.CODE,
        AD.Type,
        AD.DESCRIPTION,
        AD.QUANTITY,
        AD.[COSTS],
        B.UOM
From    Table1  AD
Join    TableB  B   On  B.Code = AD.Code
Where   AD.Code = 'A'