Sql 查找两个表中缺少的项

Sql 查找两个表中缺少的项,sql,ms-access,Sql,Ms Access,基本上我有以下4个表(包括两个查找表) 我的意图基本上是首先需要找出哪些是匹配的记录 在ModTab和MedTab之间通过链接键(ItemID和TrfCode通过Lookup1),然后 MedTab中缺少ModTab和viceversa中的OptCodes 我能一次完成吗 关键字段是具有相同名称的字段 链接MedTab和Lookup2时,需要同时使用StateCode和OptCode ModTab ====== Component Item ID MedTab ====== TrfCode O

基本上我有以下4个表(包括两个查找表)

我的意图基本上是首先需要找出哪些是匹配的记录 在ModTab和MedTab之间通过链接键(ItemID和TrfCode通过Lookup1),然后 MedTab中缺少ModTab和viceversa中的OptCodes

我能一次完成吗

关键字段是具有相同名称的字段

链接MedTab和Lookup2时,需要同时使用StateCode和OptCode

ModTab
======
Component
Item ID

MedTab
======
TrfCode
OptCode
StateCode



Lookup1
=======
Item ID
TrfCode

Lookup2
========
Component
StateCode
OptCode
我该怎么做

感谢你的指导

干杯


Shabar

我认为您可以使用
完全连接
来实现这一点,尽管我对您的模式的确切工作方式还不太清楚,但一些类似的方法应该可以实现:

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;
一些连接可能需要修改,但原则是,基本上完全连接数据集,这将返回每个数据集的所有记录,其中一个为空,您知道该数据集中没有记录,如果两个数据集都不为空,您知道两个数据集中都有记录

编辑

MS Access不支持
完全联接
,并且对于多个联接具有不同的联接语法,因此您必须使用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;

我还没有测试过它,我已经有一段时间没有在access中进行任何查询了,所以祈祷它第一次能工作

通常你需要一个内部连接来检索匹配的记录,而外部连接来获取“不匹配”的记录。如果我想在MS access数据库中运行这个。我想需要做一些语法修改。有没有办法直接修改语法(可能是一个工具)干杯,沙巴尔我不知道有什么工具,但我已经在access中添加了一种方法。还有一个小说明。。。。。。。如果我想按如下方式执行Lookup2.StateCode=MedTab.StateCode,那么如果将Lookup2.StateCode值设为“A1”,则需要检查MedTab.StateCode中的“T1”、“T2”值,但对于其他值,则需要一对一进行检查,这是否可能一次过干杯,或者您可以在
((Lookup2.StateCode=MedTab.StateCode)或((Lookup2.StateCode='A1')和(MedTab.StateCode IN('T1','T2'))
Hi-Greth感谢您在我的场景查找表中的回复,用于获取另一个表上的对应代码。例如,Lookup1用于获取MedTab.TrfCode的对应ModTab.ItemID,同样,Lookup2-->ModTab.Component-MedTab.OptCode,MeTab.StateCode所以在你的故事里,我猜链接有点不同。很抱歉,是我的错误没有提到这一点。如果这一场景为沙巴欢呼,它会发生什么变化