Sql 查找两个表中缺少的项
基本上我有以下4个表(包括两个查找表) 我的意图基本上是首先需要找出哪些是匹配的记录 在ModTab和MedTab之间通过链接键(ItemID和TrfCode通过Lookup1),然后 MedTab中缺少ModTab和viceversa中的OptCodes 我能一次完成吗 关键字段是具有相同名称的字段 链接MedTab和Lookup2时,需要同时使用StateCode和OptCodeSql 查找两个表中缺少的项,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
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所以在你的故事里,我猜链接有点不同。很抱歉,是我的错误没有提到这一点。如果这一场景为沙巴欢呼,它会发生什么变化