Sql 从多个项目匹配条件的外键表中选择记录

Sql 从多个项目匹配条件的外键表中选择记录,sql,foreign-keys,foreign-key-relationship,ms-access-2013,Sql,Foreign Keys,Foreign Key Relationship,Ms Access 2013,我正在从第三方获取数据,格式如下表所示,格式为MS Access 2000文件格式 文件和 纸牌 下面是这些表中的示例数据 论文表格和样本数据 +----+----------+ | ID | PaperID | +----+----------+ | 1 | 658 | | 2 | 659 | | 3 | 660 | | 4 | 661 | | 5 | 662 | | 6 | 663 | | 7 | 664

我正在从第三方获取数据,格式如下表所示,格式为MS Access 2000文件格式

  • 文件和
  • 纸牌
下面是这些表中的示例数据

论文
表格和样本数据

+----+----------+
| ID |  PaperID |
+----+----------+
| 1  |  658     |
| 2  |  659     |
| 3  |  660     |
| 4  |  661     |
| 5  |  662     |
| 6  |  663     |
| 7  |  664     |
+----+----------+
+----+----------+----------------------------------------+
| ID |  PaperID |                   TagID                |
+----+----------+----------------------------------------+
| 1  |  663     |   3                                    |
| 2  |  663     |   15 --Y                               |
| 3  |  663     |   17                                   |
| 4  |  663     |   18 --Y                               |
| 5  |  664     |   14                                   |
| 62 |  658     |   9                                    |
| 63 |  658     |   14                                   |
| 64 |  658     |   17                                   |
| 65 |  659     |   15 --Y                               |
| 66 |  659     |   17                                   |
| 67 |  659     |   18 --Y                               |
| 68 |  660     |   17                                   |
| 69 |  660     |   18 --N as it has only 18 and not 15  |
| 70 |  661     |   10                                   |
| 71 |  661     |   17                                   |
| 72 |  661     |   18 --N as it has only 18 and not 15  |
| 73 |  662     |   18 --N as it has only 18 and not 15  |
| 74 |  662     |   14                                   |
| 75 |  662     |   17                                   |
| 76 |  662     |   18 --N as it has only 18 and not 15  |
+----+----------+----------------------------------------+
PaperTags
表格和样本数据

+----+----------+
| ID |  PaperID |
+----+----------+
| 1  |  658     |
| 2  |  659     |
| 3  |  660     |
| 4  |  661     |
| 5  |  662     |
| 6  |  663     |
| 7  |  664     |
+----+----------+
+----+----------+----------------------------------------+
| ID |  PaperID |                   TagID                |
+----+----------+----------------------------------------+
| 1  |  663     |   3                                    |
| 2  |  663     |   15 --Y                               |
| 3  |  663     |   17                                   |
| 4  |  663     |   18 --Y                               |
| 5  |  664     |   14                                   |
| 62 |  658     |   9                                    |
| 63 |  658     |   14                                   |
| 64 |  658     |   17                                   |
| 65 |  659     |   15 --Y                               |
| 66 |  659     |   17                                   |
| 67 |  659     |   18 --Y                               |
| 68 |  660     |   17                                   |
| 69 |  660     |   18 --N as it has only 18 and not 15  |
| 70 |  661     |   10                                   |
| 71 |  661     |   17                                   |
| 72 |  661     |   18 --N as it has only 18 and not 15  |
| 73 |  662     |   18 --N as it has only 18 and not 15  |
| 74 |  662     |   14                                   |
| 75 |  662     |   17                                   |
| 76 |  662     |   18 --N as it has only 18 and not 15  |
+----+----------+----------------------------------------+
现在,我的最终用户将传递一个或多个TagID,例如15和18。我的目标是找到所有包含这些TagID的paperID。在这些示例中,我需要返回663和659

我尝试了下面的查询,但如果数据中有任何小故障,那么它就不起作用。例如,PaperID 662在具有相同TagID的表中出现两次,因此count(PaperID)=2结果为真,并将在我的结果中结束

select Count(PaperID), PaperID from PaperTags
group by TagID, PaperID
having TagID = 15 or TagID = 18
and count(PaperID) = 2
我尝试的另一个问题是

select * from Papers
where Papers.PaperID
in 
(
select PaperTags.PaperID from PaperTags
where (PaperTags.Tagid = 15 or PaperTags.Tagid = 18)
and PaperTags.PaperID = Papers.PaperID 
)
我已经阅读了下面的文章,但由于我使用MSAccess,所以无法使用这种方法

我认为必须有更好的过滤方法。非常感谢您的帮助。

类似以下内容:

SELECT G.ContentID
FROM (
SELECT PT.ContentID, PT.TagID
FROM PaperTags AS PT
WHERE PT.TagID IN (15, 18)
GROUP BY PT.ContentID, PT.TagID
) AS G
GROUP BY G.ContentId
HAVING Count(*) = 2

@T McKeown-在access中,我遇到错误“查询表达式‘Count(DISTINCT ContentID)’中的语法错误(缺少运算符)”我用Count(DISTINCT ContentID)测试了一个简单查询,但仍然得到相同的错误我认为MS access不支持Count(DISTINCT ColumnName)仍然相同的结果:(因为最内部的查询提供了唯一的行,但是当我们将其与外部查询联接时,我们的计数仍然会显示两次,因为外部查询中没有明显的行。我正在考虑在启动查询之前删除重复的行,以使事情更简单。