SQL选择其他一个列的值在另一个条件列中通用的行
发布时间:2020-12-12 08:32:55 所属栏目:MsSql教程 来源:网络整理
导读:我有一个交叉参考表,如下所示: id document_id subject_id1 8 212 5 173 5 764 7 885 9 176 9 767 2 76 它将文档与主题相匹配.文件可以是多个主题的成员.我想从表中返回一个给定文档与给定集中的所有主题相匹配的行.例如,给定一组主题: (17,76) 我想只返回
我有一个交叉参考表,如下所示:
id document_id subject_id 1 8 21 2 5 17 3 5 76 4 7 88 5 9 17 6 9 76 7 2 76 它将文档与主题相匹配.文件可以是多个主题的成员.我想从表中返回一个给定文档与给定集中的所有主题相匹配的行.例如,给定一组主题: (17,76) 我想只返回匹配该集合中所有主题(至少)交叉引用表中某处的文档的行.给定上述设置的所需输出组将是: id document_id subject_id 2 5 17 3 5 76 5 9 17 6 9 76 请注意,表格的最后一行不会返回,因为该文档仅匹配所需主题之一. 在SQL中查询的最简单和最有效的方法是什么? 解决方法我假设这个表的natrual键是document_id subject_id,该id是一个代理; IOW,document_id和subject_id是唯一的.因此,我只是假装它不存在,唯一的约束是自然键.我们从明显的开始吧. SELECT document_id,subject_id FROM document_subjects WHERE subject_id IN (17,76) 这让你想要的一切,加上你不想要的东西.所以我们需要做的就是过滤出其他的东西. “其他东西”是具有不等于期望主题的计数的计数的行组. SELECT document_id FROM document_subjects WHERE subject_id IN (17,76) GROUP BY document_id HAVING COUNT(*) = 2 请注意,subject_id因为不参与分组而被删除.进一步,我要添加一个名为subjects_i_want的虚拟表,其中包含N行您想要的主题. SELECT document_id FROM document_subjects WHERE subject_id IN (SELECT subject_id FROM subjects_i_want) GROUP BY document_id HAVING COUNT(*) = (SELECT COUNT(*) FROM subjects_i_want) 显然,subject_i_want可以替换为另一个子查询,临时表或任何内容.但是,一旦你有这个document_id的列表,你可以在更大的查询的子选中使用它. SELECT document_id,subject_id,... FROM document_subjects WHERE document_id IN( SELECT document_id FROM document_subjects WHERE subject_id IN (SELECT subject_id FROM subjects_i_want) GROUP BY document_id HAVING COUNT(*) = (SELECT COUNT(*) FROM subjects_i_want)) 管他呢. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |