选择不在另一个表中的记录和其他条件

时间:2014-01-20 14:05:32

标签: sql select

我正在使用ACCESS DB。

我有1个表(tblData),其中包含1列(DataId)和3个条目:

tblData (A)
+--------+
| DataId |
+--------+
|   1    | 
|   2    |
|   3    |
+--------+

另一个表(tblSelections)包含3列(id,dataid,userid)并有3个条目:

tblSelections (B)
+----+--------+---------+
| id | dataid | userid  |
+----+--------+---------+
|  1 | 1      | 5       |
|  2 | 2      | 5       |
|  3 | 3      | 2       |
+----+--------+---------+

如何从表A(tblData)中选择某些'userid'不在tbl B(tblSelections)中的记录?

对于'userid'5,查询必须从表A返回'DataId'3作为dataid 1&对于用户标识5,表B中已经存在2。

对于'userid'2,查询必须返回'DataId'1&来自表A的图2中的数据ID 3已存在于表B中,用于用户ID 2。

对于'userid'1,查询必须返回'DataId'1,2&表A中的3表示用户ID 1的表B中没有记录

2 个答案:

答案 0 :(得分:1)

对您的查询使用EXISTS或IN:

SELECT * 
FROM tblData 
WHERE DataId NOT IN
(
  SELECT dataid 
  FROM tblSelections 
  WHERE userid = 5
);

SELECT * 
FROM tblData 
WHERE NOT EXISTS
(
  SELECT *
  FROM tblSelections 
  WHERE tblSelections.dataid = tblData.DataId AND tblSelections.userid = 5
);

答案 1 :(得分:0)

您可以使用外部联接来选择所有记录,然后在where子句中添加b中不可为空的列为null的条件。这将根据加入条件为ab中没有匹配行的所有记录提供。

此查询假定您有一个名为@userid的参数或变量,表示要搜索的用户ID。

select
    a.*

from tblData a

left join tblSelections b on b.dataid = a.dataid and b.userid = @userid

where b.id is null