2013-08-06 49 views
-1

我有两个表在MS Access 2010:加入两个表,并显示不同的记录

PART注销表:

PART_ID DRAWN_DATE LOCATION_ID 
C0001 07/29/2013  501 
C0002 07/29/2013  604 
C0003 08/01/2013  703 
C0004 08/01/2013  807 
C0005 08/02/2013  505 
C0006 08/02/2013  602 
C0007 08/02/2013  707 
C0008 08/03/2013  802 
C0009 08/03/2013  803 
C0001 10/01/2013  605 
C0002 10/02/2013  704 
C0004 10/05/2013  806 

返还部件表:

PART_ID RETURN_DATE LOCATION_ID 
C0001 09/04/2013  STORE 
C0002 09/05/2013  STORE 
C0004 09/10/2013  STORE 
C0007 09/12/2013  STORE 
C0008 09/13/2013  STORE 
C0002 10/03/2013  STORE 

这是我想要的结果:

PART_ID DRAWN_DATE LOG-OUT LOCATION RETURN_DATE RETURN LOCATION 
C0001 07/29/2013  501  09/04/2013  STORE 
C0001 10/01/2013  605 
C0002 07/29/2013  604  09/05/2013  STORE 
C0002 10/02/2013  704  10/03/2013  STORE 
C0003 08/01/2013  703 
C0004 08/01/2013  807  09/10/2013  STORE 
C0004 10/05/2013  806   
C0005 08/02/2013  505 
C0006 08/02/2013  602 
C0007 08/02/2013  707  09/13/2013  STORE 
C0008 08/03/2013  802  10/03/2013  STORE 
C0009 08/03/2013  803 

B UT我只能得到这样的:

PART_ID DRAWN_DATE LOG-OUT LOCATION RETURN_DATE RETURN LOCATION 
C0001 07/29/2013  501  09/04/2013  STORE 
C0001 10/01/2013  605  `09/04/2013  STORE` 
C0002 07/29/2013  604  09/05/2013  STORE 
`C0002 07/29/2013  604`  10/03/2013  STORE 
C0002 10/02/2013  704  `09/05/2013  STORE` 
`C0002 10/02/2013  704  10/03/2013  STORE` 
C0003 08/01/2013  703 
C0004 08/01/2013  807  09/10/2013  STORE 
C0004 10/05/2013  806  `09/10/2013  STORE` 
C0005 08/02/2013  505 
C0006 08/02/2013  602 
C0007 08/02/2013  707  09/13/2013  STORE 
C0008 08/03/2013  802  10/03/2013  STORE 
C0009 08/03/2013  803 

我写了后:

SELECT L.PART_ID, L.DRAWN_DATE, L.LOCATION_ID AS [LOG-OUT LOCATION], R.RETURN_DATE, R.LOCATION_ID AS RETURN_LOCATION FROM (SELECT * FROM [PART LOG-OUT] ORDER BY PART_ID) AS L LEFT JOIN (SELECT * FROM [PART RETURN] ORDER BY PART_ID) AS R ON L.PART_ID = R.PART_ID ORDER BY L.PART_ID, L.DRAWN_DATE, R.RETURN_DATE;

有人可以纠正我?谢谢!

回答

1

您的要求有点含糊,所以我可能会关闭,但您似乎想将返回与仅在返回之前的时间配对,像这样?

SELECT L.PART_ID, L.DRAWN_DATE, L.LOCATION_ID AS [LOG-OUT LOCATION], 
     MIN(R.RETURN_DATE), MIN(R.LOCATION_ID) AS RETURN_LOCATION 
FROM (SELECT * FROM [LOG_OUT LOCATION]) AS L 
LEFT JOIN (SELECT * FROM [PART_RETURN]) AS R 
    ON L.PART_ID = R.PART_ID AND L.DRAWN_DATE < R.RETURN_DATE 
GROUP BY L.LOCATION_ID,L.PART_ID,L.DRAWN_DATE 
ORDER BY L.PART_ID, L.DRAWN_DATE, MIN(R.RETURN_DATE) 

An SQLfiddle to test with

请注意,由于没有将单次购物与单次退货配对(并且在您的问题中没有此类样品),因此配对逻辑非常基本。

+0

是的,这就是我要找的。非常感谢! – user2652375

+0

经过一些修改后,SELECT L.PART_ID,L.DRAWN_DATE,L.LOCATION_ID AS [LOG-OUT LOCATION], MIN(R.RETURN_DATE),MIN(R.LOCATION_ID)AS RETURN_LOCATION FROM(SELECT * FROM [PART LOG -OUT])AS L LEFT JOIN(SELECT * FROM [PART RETURN])AS R ON L.PART_ID = R.PART_ID AND L.DRAWN_DATE user2652375

0

当您加入PART_ID专栏时,您所得到的结果就是您期望得到的结果。

例如,有两个C0001LOG-OUT表,这些都将加入到同一个C0001PART RETURN表作为没有什么相互distringuish在返回表中的行:

PART LOG-OUT TABLE   -> PART RETURN TABLE 
C0001 07/29/2013  501 -> C0001 09/04/2013  STORE 
C0001 10/01/2013  605 -> C0001 09/04/2013  STORE 

您需要加入其他条件,或者您需要加入更多的唯一标识符才能实现您要查找的结果。

+0

有什么建议吗? – user2652375

+0

如果应该加入'C0001,07/29/2013,501'并且'C0001,10/01/2013,605'不应该,你需要找到一种方法来区分这两者。根据你所显示的表格结构,我看不到一种方法来实现它,因为无法知道你应该在PART RETURN TABLE中加入哪个'C0001'。 –

0
SELECT L.PART_ID, L.DRAWN_DATE, L.LOCATION_ID AS [LOG-OUT LOCATION], R.RETURN_DATE, R.LOCATION_ID AS RETURN_LOCATION FROM (SELECT * FROM [PART LOG-OUT] ORDER BY PART_ID) AS L LEFT OUTER JOIN (SELECT * FROM [PART RETURN] ORDER BY PART_ID) AS R ON L.PART_ID = R.PART_ID ORDER BY L.PART_ID, L.DRAWN_DATE, R.RETURN_DATE; 
+0

程序运行后,LEFT OUTER JOIN将被转换为LEFT JOIN。 – user2652375

相关问题