2

我正在努力研究如何加入几个表以在查询中获得特定结果。

我有两张桌子:

  1. 一个[T_Prog]表,其中包含所有可能的ID1&ID2记录, PRGCASH每条记录的数量与其各自的MONTHNUMBER.

  2. 一个[T_ALS]表,其中包含所有可能的ID1&ID2记录的一部分,其中ALSCASH每个记录都针对其各自的MONTHNUMBER.

我想要做的是将PRGCASHandALSCASH字段放入单个查询中,并与它们各自的ID1,ID2MONTHNUMBER字段进行适当匹配。

每个表中记录的唯一性是ID1,ID2MONTHNUMBER字段的组合。

我遇到的问题是,该[T_ALS]表包含的MONTHNUMBER每个唯一ID1ID2组合条目比表中包含的条目更多[T_Prog]

所以如果我这样做...

SELECT [T_Prog].ID1, [T_Prog].ID2, [T_Prog].MONTHNUMBER, [T_Prog].PRGCASH, [T_ALS].ALSCASH
FROM [T_Prog] 
LEFT JOIN [T_ALS] ON ([T_Prog].ID1 = [T_ALS].ID1) AND ([T_Prog].ID2 = [T_ALS].ID2) AND ([T_Prog].MONTHNUMBER = [T_ALS].MONTHNUMBER)

...我得到了所有可能的记录,但是由于表没有等效记录,因此任何其他记录[T_ALS]MONTHNUMBER将丢失。[T_Prog]

如果我这样做...

SELECT [T_ALS].ID1, [T_ALS].ID2, [T_ALS].MONTHNUMBER, [T_Prog].PRGCASH, [T_ALS].ALSCASH
FROM [T_ALS] 
LEFT JOIN [T_Prog] ON ([T_ALS].ID1 = [T_Prog].ID1) AND ([T_ALS].ID2 = [T_Prog].ID2) AND ([T_ALS].MONTHNUMBER = [T_Prog].MONTHNUMBER)

...我不会得到所有可能的记录,因为该[T_ALS]表仅包含所有可能记录的一部分。

这是带有示例数据的 2 个表和我试图实现的最终查询表的说明:

Prog桌子:

|[ID1]|[ID2]|[MONTHNUMBER]|[PRGCASH]|
|  1  |  A  |      1      |   600   |
|  1  |  B  |      1      |   500   |

ALS桌子:

|[ID1]|[ID2]|[MONTHNUMBER]|[ALSCASH]|
|  1  |  A  |      1      |   100   |
|  1  |  A  |      2      |   100   |
|  1  |  A  |      3      |   100   |

理想结果:

|[ID1]|[ID2]|[MONTHNUMBER]|[PRGCASH]|[ALSCASH]|
|  1  |  A  |      1      |   600   |   100   |
|  1  |  A  |      2      |         |   100   |
|  1  |  A  |      3      |         |   100   |
|  1  |  B  |      1      |   500   |         |
4

1 回答 1

2

此查询使用 Access 2007 测试,返回您想要的结果集。

SELECT
    p1.ID1,
    p1.ID2,
    p1.MONTHNUMBER,
    p1.PRGCASH,
    a1.ALSCASH
FROM
    T_Prog AS p1
    LEFT JOIN T_ALS AS a1
    ON
            p1.MONTHNUMBER = a1.MONTHNUMBER
        AND p1.ID2 = a1.ID2
        AND p1.ID1 = a1.ID1
UNION
SELECT
    a2.ID1,
    a2.ID2,
    a2.MONTHNUMBER,
    p2.PRGCASH,
    a2.ALSCASH
FROM
    T_ALS AS a2
    LEFT JOIN T_Prog AS p2
    ON
            a2.MONTHNUMBER = p2.MONTHNUMBER
        AND a2.ID2 = p2.ID2
        AND a2.ID1 = p2.ID1;
于 2013-04-09T15:14:19.127 回答