比较SQL查询

时间:2015-12-11 18:37:06

标签: sql oracle

我正在考虑两个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的示例表实例,以便查询根据该表实例产生不同的结果?

感谢您的时间和精力。

3 个答案:

答案 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'不会成为输出的一部分。

感谢大家的建设性建议,这对我帮助很大。