2013-02-01 183 views
0

基本上我有以下4个表(包括两个查找表)找出了丢失物品跨越2个表

我的目的基本上是首先需要找出哪些是匹配的记录 ModTab和MedTab之间通过链路密钥( ItemID & TrfCode通过Lookup1)然后 丢失MedTab中的ModTab中的OptCodes,反之亦然。

我能做到这一点有一个去

重点领域是一个具有相同的名称。

当链接MedTab & LOOKUP2需要同时使用StateCode和OptCode中

ModTab 
====== 
Component 
Item ID 

MedTab 
====== 
TrfCode 
OptCode 
StateCode 



Lookup1 
======= 
Item ID 
TrfCode 

Lookup2 
======== 
Component 
StateCode 
OptCode 

我应该怎么办呢

感谢您的指导做好

干杯

Shabar

+0

通常你需要一个内部连接来检索匹配记录,外部连接来获得“不匹配”记录。 – spiritwalker

回答

0

我认为你可以实现这已经使用FULL JOIN,虽然我对您的架构的具体运作相当朦胧,沿此线服用点应该工作:

SELECT COALESCE(ModTab.ItemID, MedTab.ItemID) AS ItemID, 
     COALESCE(ModTab.TrfCode, MedTab.TrfCode) AS TrfCode, 
     COALESCE(ModTab.Component, MedTab.Component) AS Component, 
     COALESCE(ModTab.StateCode, MedTab.StateCode) AS StateCode, 
     COALESCE(ModTab.OptCode, MedTab.OptCode) AS OptCode, 
     CASE WHEN ModTab.OptCode IS NULL THEN 'MedTab Only' 
      WHEN MedTab.OptCode IS NULL THEN 'ModTab Only' 
      ELSE 'Both Tables' 
     END AS MatchStatus 
FROM ( SELECT l1.ItemID, 
        l1.TrfCode, 
        l2.Component, 
        l2.StateCode, 
        l2.OptCode 
      FROM ModTab m 
        INNER JOIN Lookup1 l1 
         ON l1.ItemID = m.ItemID 
        INNER JOIN Lookup2 l2 
         ON l2.Component = m.Component 
     ) ModTab 
     FULL JOIN 
     ( SELECT l1.ItemID, 
        l1.TrfCode, 
        l2.Component, 
        l2.StateCode, 
        l2.OptCode 
      FROM MedTab m 
        INNER JOIN Lookup1 l1 
         ON l1.TrfCode = m.TrfCode 
        INNER JOIN Lookup2 l2 
         ON l2.StateCode = m.StateCode 
         AND l2.OptCode = m.OptCode 
     ) MedTab 
      ON ModTab.ItemID = MedTab.ItemID 
      AND ModTab.TrfCode = MedTab.TrfCode 
      AND ModTab.Component = MedTab.Component 
      AND ModTab.StateCode = MedTab.StateCode 
      AND ModTab.OptCode = MedTab.OptCode; 

一些联接可能需要修正,但原则是那里,基本上完全加入数据集,这将返回来自每个记录的所有记录,其中一个为null,您知道记录不在该集合中,其中两个都不为null,您知道记录在两个记录中。

编辑

MS-Access不支持FULL JOIN并具有多种不同的JOIN语法联接,所以你将不得不使用UNION合并的记录,然后检查该纪录来源。像这样的东西应该这样做:

SELECT ItemID, 
     TrfCode, 
     Component, 
     StateCode, 
     OptCode, 
     IIF(SUM(MedTab)=0,'ModTab',IIF(SUM(ModTab)=0,'MedTab','Both')) AS TabStatus 
FROM ( SELECT Lookup1.ItemID, 
        Lookup1.TrfCode, 
        Lookup2.Component, 
        Lookup2.StateCode, 
        Lookup2.OptCode, 
        1 AS MedTab, 
        0 AS ModTab 
      FROM ( MedTab 
         INNER JOIN Lookup1 
          ON Lookup1.TrfCode = MedTab.TrfCode 
        ) 
        INNER JOIN Lookup2 
         ON Lookup2.StateCode = MedTab.StateCode 
         AND Lookup2.OptCode = MedTab.OptCode 
      UNION ALL 
      SELECT Lookup1.ItemID, 
        Lookup1.TrfCode, 
        Lookup2.Component, 
        Lookup2.StateCode, 
        Lookup2.OptCode, 
        0 AS MedTab, 
        1 AS ModTab 
      FROM ( ModTab 
         INNER JOIN Lookup2 
          ON ModTab.Component = Lookup2.Component 
        ) 
        INNER JOIN Lookup1 
         ON ModTab.ItemID = Lookup1.ItemID 
     ) 
GROUP BY ItemID, TrfCode, Component, StateCode, OptCode; 

我没有测试过这一点,它是一段时间,因为我没有任何疑问的访问,因此手指交叉它的作品第一次!

+0

嗨GarethD Thax您的回复。如果我想在MS访问数据库中运行它。我想需要做一些语法修改。是否有任何方法可以立即更改语法(可能是一个工具)Cheers Shabar – shabar

+0

我没有意识到的工具,但我在访问中添加了一种方法。 – GarethD

+0

另一个小澄清.......如果我想要执行Lookup2.StateCode = MedTab.StateCode,如下所示 如果将Lookup2.StateCode值作为“A1”需要检查“T1 ”,‘在MedTab.StateCode 但是对于其他值T2’的价值观需要检查一对一 这可能在一个去 干杯 Shabar – shabar