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 连接两个具有不同结构的表_Sql_Ms Access - Fatal编程技术网

Sql 连接两个具有不同结构的表

Sql 连接两个具有不同结构的表,sql,ms-access,Sql,Ms Access,我有两个在查询中定义了关系的表,我的目标是在不重复库存和差异信息的情况下合并这两个表 表1中的库存信息不应重复,因为它已经是汇总库存,而在表2中,我需要按项目显示它,因为我想查看技师位置信息 另外,如果表1中的项目在表2中没有记录(反之亦然),我仍然需要显示它的详细信息。我目前的解决方案是创建两个查询,然后在excel中导出输出,然后应用一些vlookups 表1详情: +---------+-----------+----------+-----------+ | ITEMID | WARE

我有两个在查询中定义了关系的表,我的目标是在不重复库存和差异信息的情况下合并这两个表

表1中的库存信息不应重复,因为它已经是汇总库存,而在表2中,我需要按项目显示它,因为我想查看技师位置信息

另外,如果表1中的项目在表2中没有记录(反之亦然),我仍然需要显示它的详细信息。我目前的解决方案是创建两个查询,然后在excel中导出输出,然后应用一些vlookups

表1详情:

+---------+-----------+----------+-----------+ | ITEMID | WAREHOUSE | LOCATION | INVENTORY | +---------+-----------+----------+-----------+ | ITEM001 | WHS001 | LOC001 | 5 | | ITEM002 | WHS001 | LOC002 | 4 | | ITEM003 | WHS001 | LOC003 | 2 | +---------+-----------+----------+-----------+ 输出:

+----------+-------------+------------+-------------+----------+-------------+------------+--------------+-------------+----------+ | a.ITEMID | a.WAREHOUSE | a.LOCATION | a.INVENTORY | b.ITEMID | b.WAREHOUSE | b.LOCATION | LOCATIONNAME | b.INVENTORY | VARIANCE | +----------+-------------+------------+-------------+----------+-------------+------------+--------------+-------------+----------+ | ITEM001 | WHS001 | LOC001 | 5 | ITEM001 | KITBAG | T01 | TECH001 | 1 | 4 | | ITEM001 | WHS001 | LOC001 | 5 | ITEM001 | KITBAG | T02 | TECH002 | 2 | 3 | | ITEM001 | WHS001 | LOC001 | 5 | ITEM001 | KITBAG | T03 | TECH003 | 3 | 2 | | ITEM002 | WHS001 | LOC002 | 4 | ITEM002 | KITBAG | T01 | TECH001 | 1 | 3 | | ITEM002 | WHS001 | LOC002 | 4 | ITEM002 | KITBAG | T02 | TECH002 | 3 | 1 | +----------+-------------+------------+-------------+----------+-------------+------------+--------------+-------------+----------+ +----------+-------------+------------+-------------+----------+-------------+------------+--------------+-------------+----------+ |a.ITEMID | a.WAREHOUSE | a.LOCATION | a.INVENTORY | b.ITEMID | b.WAREHOUSE | b.LOCATION | LOCATIONNAME | b.INVENTORY |差异| +----------+-------------+------------+-------------+----------+-------------+------------+--------------+-------------+----------+ |项目001 | WHS001 | LOC001 | 5 |项目001 | KITBAG | T01 |技术001 | 1 | 4| |项目001 | WHS001 | LOC001 | 5 |项目001 | KITBAG | T02 |技术002 | 2 | 3| |项目001 | WHS001 | LOC001 | 5 |项目001 | KITBAG | T03 | TECH003 | 3 | 2| |项目002 | WHS001 | LOC002 | 4 |项目002 | KITBAG | T01 |技术001 | 1 | 3| |项目002 | WHS001 | LOC002 | 4 |项目002 | KITBAG | T02 |技术002 | 3 | 1| +----------+-------------+------------+-------------+----------+-------------+------------+--------------+-------------+----------+ 期望输出:

+----------+-------------+------------+-------------+----------+-------------+------------+--------------+-------------+----------+ | a.ITEMID | a.WAREHOUSE | a.LOCATION | a.INVENTORY | b.ITEMID | b.WAREHOUSE | b.LOCATION | LOCATIONNAME | b.INVENTORY | VARIANCE | +----------+-------------+------------+-------------+----------+-------------+------------+--------------+-------------+----------+ | ITEM001 | WHS001 | LOC001 | 5 | ITEM001 | WHS001 | T01 | TECH001 | 1 | -1 | | ITEM001 | WHS001 | LOC001 | 0 | ITEM001 | WHS001 | T02 | TECH002 | 2 | 0 | | ITEM001 | WHS001 | LOC001 | 0 | ITEM001 | WHS001 | T03 | TECH003 | 3 | 0 | | ITEM002 | WHS001 | LOC002 | 4 | ITEM002 | WHS001 | T01 | TECH001 | 1 | 0 | | ITEM002 | WHS001 | LOC002 | 0 | ITEM002 | WHS001 | T02 | TECH002 | 3 | 0 | | ITEM003 | WHS001 | LOC003 | 2 | NULL | NULL | NULL | NULL | 0 | 2 | +----------+-------------+------------+-------------+----------+-------------+------------+--------------+-------------+----------+ +----------+-------------+------------+-------------+----------+-------------+------------+--------------+-------------+----------+ |a.ITEMID | a.WAREHOUSE | a.LOCATION | a.INVENTORY | b.ITEMID | b.WAREHOUSE | b.LOCATION | LOCATIONNAME | b.INVENTORY |差异| +----------+-------------+------------+-------------+----------+-------------+------------+--------------+-------------+----------+ |项目001 | WHS001 | LOC001 | 5 |项目001 | WHS001 | T01 |技术001 | 1 |-1| |项目001 | WHS001 | LOC001 | 0 |项目001 | WHS001 | T02 |技术002 | 2 | 0| |项目001 | WHS001 | LOC001 | 0 |项目001 | WHS001 | T03 |技术003 | 3 | 0| |项目002 | WHS001 | LOC002 | 4 |项目002 | WHS001 | T01 |技术001 | 1 | 0| |项目002 | WHS001 | LOC002 | 0 |项目002 | WHS001 | T02 |技术002 | 3 | 0| |项目003 | WHS001 | LOC003 | 2 |零|零|零|零| 0 | 2| +----------+-------------+------------+-------------+----------+-------------+------------+--------------+-------------+----------+ 欢迎来到SO! 您应该使用
UNION
而不是
UNION ALL


请查看差异的完整描述。

您希望显示表1中的行,即使它们在表2中不匹配。这是通过外部联接完成的:

select
  t1.itemid,
  t1.warehouse,
  t1.location as t1_location,
  t1.inventory as t1_inventory,
  t2.location as t2_location,
  t2.locationname as t2_locationname,
  (t2.inventory, 0) as t2_inventory,
  t1.inventory - nz(t2.inventory, 0) as variance
from table1 as t1
left join table2 as t2 on t2.itemid = t1.itemid
order by t1.itemid;
我希望MS Access在语法上接受这一点。MS Access在遵守SQL标准方面非常糟糕


您在两个表中都有项目的仓库。也许您想将其包含在
ON
子句中,也许不想。您决定:-)

如果您只是使用
UNION
而不是
UNION ALL
查询将消除重复项!p、 欢迎来到论坛!:-)我不知道数据,但是您正在将
ITEMID
MIN(库存)
进行比较,对吗?我想,获取重复项不是您唯一的问题。第一个查询看起来像一个聚合,而实际上不是。
a.inventory
b.inventory
都在您的
分组中。所以,
MIN(a.INVENTORY)
只是
a.INVENTORY
MIN(b.INVENTORY)
只是
b.INVENTORY
。这使得整个
分组变得多余。请准确显示您想要选择的内容。显示示例数据和预期结果。表的键是什么?@Thorsten我已经添加了详细信息,请参考我附加的图片。谢谢你。所以你认为第一个查询在a记录中会有空值,所以第二个查询会有重复项?或者您是否使用了
UNION
作为副作用,不是真的希望删除两个联合查询产生的重复项,而是删除一个(或每个)查询中的重复项?我不喜欢这个答案,因为您建议使用广泛的工具来消除症状,而不是查看问题的根源。感谢您的帮助。我将尝试在sql中运行此功能。在ms access中运行会显示我所需的信息,但我对表1中的重复数量(下一行)有问题,我不理解。这个查询将适用于您提供的示例数据,对吗?因此,将示例数据添加到您的请求中,此查询存在问题。在desire output details中,您将看到库存不重复。。第一行是5,第二行和第三行都是零。如果表1库存不重复,则按行计算差异(这在技术上是正确的)。希望这能解释我的目的对不起给你添麻烦了。谢谢你。哦,对不起。你说得对,我没看到这个。您正在尝试的是复杂的,MS Access更是如此。如果您使用的是一个好的DBMS(Oracle、PostgreSQL、SQL Server等等),我们将使用窗口函数来实现这一点。但使用MS Access,这是不可能的。在Access中,您将需要三个查询 +----------+-------------+------------+-------------+----------+-------------+------------+--------------+-------------+----------+ | a.ITEMID | a.WAREHOUSE | a.LOCATION | a.INVENTORY | b.ITEMID | b.WAREHOUSE | b.LOCATION | LOCATIONNAME | b.INVENTORY | VARIANCE | +----------+-------------+------------+-------------+----------+-------------+------------+--------------+-------------+----------+ | ITEM001 | WHS001 | LOC001 | 5 | ITEM001 | WHS001 | T01 | TECH001 | 1 | -1 | | ITEM001 | WHS001 | LOC001 | 0 | ITEM001 | WHS001 | T02 | TECH002 | 2 | 0 | | ITEM001 | WHS001 | LOC001 | 0 | ITEM001 | WHS001 | T03 | TECH003 | 3 | 0 | | ITEM002 | WHS001 | LOC002 | 4 | ITEM002 | WHS001 | T01 | TECH001 | 1 | 0 | | ITEM002 | WHS001 | LOC002 | 0 | ITEM002 | WHS001 | T02 | TECH002 | 3 | 0 | | ITEM003 | WHS001 | LOC003 | 2 | NULL | NULL | NULL | NULL | 0 | 2 | +----------+-------------+------------+-------------+----------+-------------+------------+--------------+-------------+----------+
select
  t1.itemid,
  t1.warehouse,
  t1.location as t1_location,
  t1.inventory as t1_inventory,
  t2.location as t2_location,
  t2.locationname as t2_locationname,
  (t2.inventory, 0) as t2_inventory,
  t1.inventory - nz(t2.inventory, 0) as variance
from table1 as t1
left join table2 as t2 on t2.itemid = t1.itemid
order by t1.itemid;