我们希望所有选择第1类作为他们喜欢的类别的成员也将类别9添加为他们喜欢的类别之一。我假设以下三个查询将始终产生完全相同的结果(假设FavCategory.CategoryID和FavCategory.MemberID形成主键):
SELECT 9, md1.MemberId FROM MemberDetails AS MD1
INNER JOIN FavCategory as FC1
ON MD1.MemberId = FC1.MemberId
WHERE FC1.CategoryId = 1
AND NOT EXISTS
(SELECT * FROM FavCategory AS FC2
WHERE FC2.MemberId = FC1.MemberId
AND FC2.CategoryId = 9);
SELECT 9, MemberId FROM MemberDetails AS MD1
WHERE EXISTS
(SELECT * FROM FavCategory FC1
WHERE FC1.CategoryId = 1 AND FC1.MemberId = MD1.MemberId
AND NOT EXISTS
(SELECT * FROM FavCategory AS FC2
WHERE FC2.MemberId = FC1.MemberId
AND FC2.CategoryId = 9));
SELECT 9, MemberId FROM MemberDetails AS MD1
WHERE EXISTS
(SELECT * FROM FavCategory FC1
WHERE FC1.CategoryId = 1 AND FC1.MemberId = MD1.MemberId)
AND NOT EXISTS
(SELECT * FROM FavCategory AS FC2
WHERE MD1.MemberId = FC2.MemberId
AND FC2.CategoryId = 9);
感谢名单
答案 0 :(得分:3)
由于您没有订单,因此无法保证订购相同。我知道,可能不是你问的。
第一个查询返回MemberDetails记录集,这些记录在FIDCategory中通过MemberID上的内部联接具有相应的条目。
接下来的两个查询通过基于MemberID的exists子句返回在FavCategory中具有相应条目的MemberDetails记录集 - 一种手动内连接。在这两个中, not exists 子句通过与MemberDetails或FavCategory中的MemberID进行比较而有所不同 - 但由于MemberID是相同的,因此应该没有区别。
所以我相信可以肯定地说,由三个查询中的每一个产生的无序数据集将是相同的。
那说,你应该测试一下。 Visual Studio(2010和2005/2008的一些变种)有一个工具,可以用大量任意数据填充表格 - 这可能是验证互联网上一些随机傻瓜的思考的好方法。 :)
答案 1 :(得分:2)
我也相信所有三个都会提供完全相同的结果,但我不是100%确定数据库会像你没有用别名作为前缀的MemberId那样,因为这个名称有多个列(但它可能因为它们都具有相同的值。)
但是,为什么需要涉及MemberDetails表。对我而言,你似乎只需要它的ID,你也有FavCategory.MemberId,所以我相信你可以让它们变得更聪明(只涉及FavCategory,两次)。