我正在考虑两个SQL查询(Oracle),我将通过展示示例来说明它们之间的区别。查询如下:
/* Query 1 */
SELECT DISTINCT countryCode
FROM Member M
WHERE NOT EXISTS(
(SELECT organisation FROM Member
WHERE countryCode = 'US')
MINUS
(SELECT organisation FROM Member
WHERE countryCode = M.countryCode ) )
/* Query 2 */
SELECT DISTINCT M1.countryCode
FROM Member M1, Member M2
WHERE M2.countryCode = 'US' AND M1.organisation = M2.organisation
GROUP BY M1.countryCode
HAVING COUNT(M1.organisation) = (
SELECT COUNT(M3.organisation)
FROM Member M3 WHERE M3.countryCode = 'US' )
据我所知,这些查询会回复与美国相同组织成员的国家/地区。会员计划是( countryCode ,组织,类型),以粗体作为主键。示例:('US','UN','member')。成员表只包含几个元组并且不完整,因此在执行(1)和(2)时都会产生相同的结果(例如德国,因为这里只有'UN'和'G7'在表中)。
那么我怎样才能证明这些查询实际上可以返回不同的结果呢?
这意味着如何创建Member的示例表实例,以便查询根据该表实例产生不同的结果?
感谢您的时间和精力。
答案 0 :(得分:2)
查询将导致所有国家/地区代码至少与美国所属的所有组织(也可能是其他组织的成员)。
答案 1 :(得分:1)
第一个查询将返回其成员资格列表长于美国的国家/地区。它确实要求它们包括与美国相同的组织,但它可能更多。
第二个要求两个成员名单相同。
至于使用实际数据创建示例,请从空表开始并添加以下行:
insert into Member (countryCode, organisation)
values ('Elbonia', 'League of Fictitious Nations')
顺便说一下,完整的外部连接可以让你对称地表征差异:
select
mo.countryCode || ' ' ||
case
when count(case when mu.organisation is null then 1 else null end) > 0
and count(case when mo.organisation is null then 1 else null end) > 0
then 'and US both have individual memberships they that do not have in common.'
when count(case when mo.organisation is null then 1 else null end) > 0
then 'is a member of some organisations that US is not a member of.'
when count(case when mo.organisation is null then 1 else null end) > 0
then 'is not a member of some organisations that US is a member of.'
else 'has identical membership as US.'
end
from
(select * from Member where countryCode = 'US') mu
full outer join
(select * from Member where countryCode = '??') mo
on mo.organisation = mu.organisation
请原谅悬挂的介词。
还有一个磁盘注释,虽然规范化数据中不允许重复行,但这个查询没有问题。
答案 2 :(得分:1)
我终于找到了一个示例,表明它们实际上可以基于相同的Member
实例输出不同的值。当Member
包含重复项时,实际上就是这种情况。对于查询1,这不是问题,但对于查询2,它实际上影响结果,因为这里成员资格的数量是至关重要的。所以,如果你有例如({FR','UN',成员)两次Member
HAVING COUNT(M1.organisation)
SELECT COUNT(M3.organisation)
将返回不同的值nginx
,而'FR'不会成为输出的一部分。
感谢大家的建设性建议,这对我帮助很大。