比较SQL查询

比较SQL查询,sql,oracle,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

我正在考虑两个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' )
据我所知,这些查询返回了与美国属于同一组织的国家。成员方案为(国家代码组织,类型),主键为粗体。例如:(‘美国’、‘联合国’、‘成员’)。成员表只包含几个元组,并且不完整,因此在执行(1)和(2)时都会产生相同的结果(例如,德国,因为这里只有“UN”和“G7”在表中)

那么,我如何证明这些查询实际上可以返回不同的结果呢

这意味着如何创建成员的示例表实例,以便查询根据该表实例生成不同的结果


谢谢你的时间和努力

查询将对美国所属的所有组织(也可以是其他组织的成员)产生至少为成员的所有国家代码。

查询将对美国所属的所有组织产生至少为成员的所有国家代码(它也可以是其他组织的成员)。

第一个查询将返回成员名单比美国长的国家。它确实要求它们包括与我们相同的组织,但可能更多

第二个要求两个成员名单相同

至于创建具有真实数据的示例,请从空表开始并添加此行:

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
请原谅那些悬而未决的介词


还有一个磁盘注释,虽然规范化数据中不允许重复行,但此查询与这些行没有问题。

第一个查询将返回成员资格列表比美国长的国家。它确实要求这些国家包括与我们相同的组织,但可能更多

第二个要求两个成员名单相同

至于创建具有真实数据的示例,请从空表开始并添加此行:

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
请原谅那些悬而未决的介词


还有一个磁盘注释,虽然规范化数据中不允许重复行,但此查询与这些行没有问题。

我终于找到了一个示例,表明它们可以基于相同的
成员
实例实际输出不同的值。实际上,当
成员
包含重复行时,情况就是这样。对于查询1,这不是问题这不是问题,但对于查询2,它实际上会影响结果,因为这里的成员数量至关重要。因此,如果您在
member
中有两次例如('FR','UN',member),
HAVING COUNT(M1.organization)
将返回不同的值作为
选择COUNT(M3.organization)
和“FR”将不属于输出的一部分


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

我终于找到了一个示例,表明它们可以基于同一个
成员
实例实际输出不同的值。当
成员
包含重复项时,实际上就是这种情况。对于查询1,这不是问题,但对于查询2,这实际上是一个问题影响结果,因为这里的成员数量至关重要。因此,如果您在
member
中有(例如,'FR',UN',member)两次,则
HAVING COUNT(M1.organization)
将返回一个不同的值,因为
选择计数(M3.organization)
并且'FR'不会是输出的一部分


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

通过查看执行计划?虽然两个查询对于您所说的操作都过于复杂,但在我看来它们得出的结果是相同的。查询计划不同,第一个是最差的。有更简单的方法编写该查询。我为什么要这样做在第一种情况下,你不需要这么复杂吗?@Siyual我很抱歉让你混淆了等价性,我已经更新了我的问题。你完全正确,但我需要证明,可能存在这样一种情况,即这些查询不会返回相同的结果。同样,是的,我完全同意你的观点,这个查询可以表达得更简单,但是我不是自己写的,它们是给定的。通过查看执行计划?虽然两个查询对于您所说的它们所做的都过于复杂,但它们在我看来得出的结果是相同的。查询计划是不同的,第一个是最差的。有更简单的方法来编写该查询。为什么在e first case?@Siyual我很抱歉让人困惑的是,我已经更新了我的问题。你完全正确,但我需要证明,可能存在这样的情况,这些查询不会返回相同的结果。同上,是的,我完全同意你的说法,查询可以表达得更简单,但我没有自己写n、 他们得到了。谢谢,你说得对。我更新了我的问题,想知道一个他们可以返回不同结果的案例。你有什么想法吗?谢谢,你说得对。我更新了我的问题,想知道一个他们可以返回不同结果的案例。你有什么想法吗?只要检查countyCode和组织具有唯一约束或主键。只需检查countyCode和组织是否具有唯一约束或主键。