MS Access:使用连锁字段加入

时间:2017-01-28 14:30:55

标签: sql ms-access

我在几个字段(ID_1和ID_2)上有一个JOIN查询。

  • ID_1永远不能为空
  • ID_2可以是空或非空。
  • ID_1& ID_2的组合是唯一的

我的问题:当ID_2为空时,JOIN没有产生所需的结果

我可以加入ID_1&的串联ID_2在查询时?一些微弱的尝试没有帮助。

我不想在2个表中创建新索引,因为其中一个不属于我。

感谢您的任何建议。

我的查询的简化版本:

SELECT Table1.ID_1, Table1.ID_2, Table1.Name, Table2.ID_1, Table2.ID_2, Table2.Owner
FROM Table1 
LEFT JOIN Table2 ON (Table1.ID_2 = Table2.ID_2) AND (Table1.ID_1 = Table2.ID_1);

使用上面的查询,我会看到ID_1,ID_2&表1中的名称,但当ID_2为空时,表2中没有任何内容

示例(“替代”)数据:: :)

表1:

ID_1   ID_2    Name
===========================
A001           ACME Corp
A001   B001    ACME Medical
A001   B002    ACME Pharmacy
A002           General Electric Corp
A003           Philips

表2:

ID_1   ID_2    Owner
===========================
A001           Bob
A001   B001    Lori
A001   B002    Becky
A002           Ravi
A003           Joe

当我LEFT JOIN时,我希望将这两个表中的信息结合起来。描述的问题呈现以下结果 - 当ID_1和ID_2都是非空时(Owner = Null不是正确的结果)时,仅加入所有者:

加入(错误结果):

ID_1   ID_2    Name              Owner   
=========================================
A001           ACME Corp
A001   B001    ACME Medical      Lori
A001   B002    ACME Pharmacy     Becky
A002           General Electric
A003           Philips

3 个答案:

答案 0 :(得分:0)

让我们看看JOINS:

INNER JOIN - 仅在两个表之间显示 COMMON ROWS 。如果连接表在 COMMON FIELD YOUR JOIN ON ON 中为NULL,则不显示该行。

LEFT JOIN - 包括左表中的所有行。右表中的非匹配条目将为NULL

RIGHT JOIN - 包含右表中的所有行。左表中的非匹配条目将为NULL

FULL JOIN - 包括左右表格中的所有行。左表和右表中的非匹配条目将为NULL。

使用 LEFT JOIN 将提供您想要的结果。

Select A.ID_1
      ,B.ID_2
From tableA A
LEFT JOIN tableB B
ON A.ID_1 = B.ID_2  

答案 1 :(得分:0)

如果您必须使用有缺陷的表设计,您可以尝试这样的查询:

CREATE TABLE cars
    (`id_person` INT, `id_car` INT, `value` INT)
;

INSERT INTO cars
    (`id_person`, `id_car`, `value`)
VALUES
    (1, 1, 1000),
    (1, 2, 2000),
    (2, 1, 2200),
    (2, 2, 1100),
    (3, 3, 3000)
;

答案 2 :(得分:0)

考虑以下变化。选择最容易维护或最有效的类型。

联盟查询

第一个SELECT捕获具有匹配ID(ID_1 = ID_2)和第二个SELECT的记录会捕获两个表中只有ID_1匹配但只有ID_2 IS NULL的记录。

SELECT t1.ID_1, t1.ID_2, t1.[Name], t2.Owner
FROM [Table1] t1 
INNER JOIN [Table2] t2 ON t1.ID_1 = t2.ID_1 AND t1.ID_2 = t2.ID_2

UNION ALL

SELECT t1.ID_1, t1.ID_2, t1.[Name], t2.Owner
FROM [Table1] t1 
INNER JOIN [Table2] t2 ON t1.ID_1 = t2.ID_1
WHERE t1.ID_2 IS NULL AND t2.ID_2 IS NULL;

或者,考虑单SELECT个语句:

明确加入 (在OR子句中ON

SELECT t1.ID_1, t1.ID_2, t1.[Name], t2.Owner
FROM [Table1] t1
INNER JOIN  [Table2] t2 ON (t1.ID_1 = t2.ID_1 AND t1.ID_2 = t2.ID_2)
      OR (t1.ID_1 = t2.ID_1 AND t1.ID_2 IS NULL AND t2.ID_2 IS NULL);

隐式加入 (没有明确JOIN的查询)

SELECT t1.ID_1, t1.ID_2, t1.[Name], t2.Owner
FROM [Table1] t1, [Table2] t2
WHERE (t1.ID_1 = t2.ID_1 AND t1.ID_2 = t2.ID_2)
   OR (t1.ID_1 = t2.ID_1 AND t1.ID_2 IS NULL AND t2.ID_2 IS NULL);

以上各项应返回(但不一定按相同顺序)以下输出:

-- ID_1     ID_2    Name                    Owner
-- A001             ACME Corp               Bob
-- A001     B001    ACME Medical            Lori
-- A001     B002    ACME Pharmacy           Becky
-- A002             General Electric Corp   Ravi
-- A003             Philips                 Joe