Sql MS访问:使用连接字段连接
我有一个在两个字段(ID_1和ID_2)上具有联接的查询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可以为Null或不为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