Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql MS访问:使用连接字段连接_Sql_Ms Access - Fatal编程技术网

Sql MS访问:使用连接字段连接

Sql MS访问:使用连接字段连接,sql,ms-access,Sql,Ms Access,我有一个在两个字段(ID_1和ID_2)上具有联接的查询 ID_1不能为空 ID_2可以为Null或不为Null ID_1和ID_2的组合是唯一的 我的问题:当ID_2为Null时,联接没有产生所需的结果 我可以在查询时加入ID_1和ID_2的连接吗?一些微弱的尝试没有起到任何作用 我不希望在这两个表中创建新索引,因为其中一个表不属于我 谢谢你的建议 我的查询的简化版本: SELECT Table1.ID_1, Table1.ID_2, Table1.Name, Table2.ID_1, T

我有一个在两个字段(ID_1和ID_2)上具有联接的查询

  • ID_1不能为空
  • ID_2可以为Null或不为Null
  • ID_1和ID_2的组合是唯一的
我的问题:当ID_2为Null时,联接没有产生所需的结果

我可以在查询时加入ID_1和ID_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);
使用上面的查询,我从表1中看到了ID_1、ID_2和Name,但当ID_2为null时,从表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
当我离开JOIN时,我希望将两个表中的信息结合起来。描述的问题给出了以下结果-仅当ID_1和ID_2均为非Null时加入所有者(Owner=Null不是正确的结果):

已加入(结果不正确):

让我们看一下连接:

内部联接-仅显示两个表之间的公用行。如果联接表在联接时的公共字段中为空,则不显示该行

左联接-包括左表中的所有行。右表中的不匹配项将为空

右连接-包括右表中的所有行。左表中的不匹配项将为空

完全联接-包括左表和右表中的所有行。左表和右表中的不匹配项将为空

使用左连接将得到所需的结果

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

如果必须接受有缺陷的表设计,可以尝试以下查询:

SELECT Table1.ID_1, Table1.ID_2, Table2.OtherInfo
FROM Table1 INNER JOIN Table2 ON ((Table1.ID_2 = Table2.ID_2) AND (Table1.ID_1 = Table2.ID_1))
OR ((Table1.ID_1 = Table2.ID_1) AND Table1.ID_2 IS NULL AND Table2.ID_2 IS NULL)

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

联合查询

第一个
SELECT
捕获具有匹配ID的记录(
ID\u 1=ID\u 2
),第二个
SELECT
捕获两个表中只有
ID\u 1
匹配但
ID\u 2为空的记录

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;

可选地,考虑单<代码>选择< /Cord>语句:

显式连接(在
子句上的
中使用

隐式联接(不带显式联接的查询

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

-- 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

使用
左连接
。并显示查询以便我们提供帮助。上面插入的示例查询如果您从
左JOIN
中删除
ID_2
ON子句,并只保留
ID_1
?@Parfait,则存在具有不同ID_2的相同ID_1的多个实例。(假设ID_1=Mfr,ID_2=Mfr_Div,那么具有多个分区的Mfr将具有相同的ID_1)。您想要什么?请用数据给我们举例说明。我们看不到任何数据,也不知道您真正想要的结果。请发布两个表中的几行,其中包含空实例和所需结果。对不起,应该已经澄清了。我在这个实例中使用了一个右连接,但是表1和表2中的NULL ID_2与匹配的条目不同。示例查询插入到thx上面!我将尝试这种方法。我不确定语法。上面的示例经过调整以适合我的示例,在联接操作中抛出语法错误。您得到的错误只是说它不能在设计视图中表示联接。它应该仍然可以正常工作。我很清楚设计视图错误。不是这样的。冻糕,看起来不错。我本周出差,但回来后会在我的实际DB中确认。我会把结果寄回去的谢谢
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);
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