选择基于另一个表删除特定记录的行

时间:2011-08-15 07:43:09

标签: sql tsql ms-access

我有下表A:

Cell1 Time1
a1    t1
a1    t2

另一张表B:

Cell2 Time2 SomeColumn2
a1    t1    c1
a1    t3    c2

我想要表B中的值,其中(Cell2,Time2)组合在表A中不是(Cell1,Time1)。

例如在给定的情况下输出将是:

Cell2 Time2 SomeColumn2
a1    t3    c2

TSQL或ms-access sql中的解决方案是什么?

3 个答案:

答案 0 :(得分:1)

select *
from TableB as TB
where not exists(select *
                 from TableA as TA
                 where TB.Cell2 = TA.Cell1 and
                       TB.Time2 = TA.Time1)

未在Microsoft Access中测试。

答案 1 :(得分:1)

SELECT b.*
FROM TableB b
LEFT JOIN TableA a ON b.Cell2=a.Cell1 AND b.Time2=A.Time1
WHERE a.Cell1 IS NULL

答案 2 :(得分:0)

您需要的关系运算符是antijoin

SQL缺少显式反连接运算符或JOIN类型或关键字;这同样适用于Access(ACE,Jet,等等)。请注意,真正的关系语言Tutorial D使用NOT MATCHING作为其反连接运算符。例如。

当然可以使用其他SQL运算符编写反连接。最常见的使用EXISTSIN (subquery)。根据数据,可以使用外部联接,对外部表测试中的键的限制为null。

就个人而言,我更喜欢在SQL中使用EXISTS进行反连接,因为join子句在编写的代码中更加靠近,并且不会导致在连接表上进行投影。这是@Mikael Eriksson的回答中使用的方法。