找到适当的连接使用时遇到严重问题

时间:2017-01-10 19:02:42

标签: sql database ms-access join

在Microsoft Access中 -

我有两张桌子,我们称之为OneTbl和TwoTbl

我想做两件事:

  1. 从OneTbl中提取所有记录,只从TwoTbl中提取记录    TwoTbl.ID存在于OneTbl.ID

  2. 从TwoTbl中提取未在第一个查询中提取的记录

  3. 我尝试为第一个做左连接,但数据重复。这是一个问题。这两个表共享所有相同的字段,它们只有不同的数据。

    在我完成初始运行后,我做了一个不同的ID计数。从理论上讲,上面列出的查询1和2的计数应该与表1和表2之间的计数相同。那种情况没有发生。

    以下是我为1号编写的查询,然后我将其粘贴到excel选项卡的末尾,该选项卡包含表1中的所有记录:

    SELECT DISTINCT T2.*
    FROM T2 INNER JOIN T1 ON T2.[Payee NPI] = T1.[Payee NPI];
    

    这是我为数字2写的,以获取表2中未在第一个查询中提取的所有剩余记录:

    SELECT DISTINCT T2.*
    FROM T2 LEFT JOIN T1 ON T2.[Payee NPI] = T1.[Payee NPI]
    WHERE T1.[Payee NPI] IS NULL
    

3 个答案:

答案 0 :(得分:1)

可以使用EXISTS和NOT EXISTS:

SELECT *
FROM OneTbl
UNION ALL
SELECT *
FROM TwoTbl t2
WHERE EXISTS
  (SELECT 1
   FROM OneTbl t1
   WHERE t1.ID=t2.ID)

SELECT *
FROM TwoTbl t2
WHERE NOT EXISTS
  (SELECT 1
   FROM OneTbl t1
   WHERE t1.ID=t2.ID)

答案 1 :(得分:0)

  

这两个表共享所有相同的字段,它们只是有不同的   数据

那么为什么不在他们之间执行UNION

select * from OneTbl
union
select * from TwoTbl
  

从OneTbl中提取所有记录,只从TwoTbl中提取记录   TwoTbl.ID存在于OneTbl.ID

LEFT JOIN就是你想要的

select t1.*, t2.*
from OneTbl t1 left join TwoTbl t2 on t1.ID = t2.ID;
  

从TwoTbl中提取未在第一个查询中提取的记录

您可以使用LEFT JOIN

再次使用WHERE IS NULL
select t2.* from OneTbl t1
left join TwoTbl t2 on t1.ID = t2.ID
where t2.ID is null;

答案 2 :(得分:0)

你似乎想要这样的东西:

select t1.*
from OneTbl as t1
where exists (select 1 from TwoTbl as t2 where t2.id = t1.id);

select t2.*
from TwoTbl as t2
where not exists (select 1 from OneTbl as t1 where t2.id = t1.id);