【问题标题】:Relational algebra without aggregate function没有聚合函数的关系代数
【发布时间】:2015-10-05 08:45:35
【问题描述】:

我们有一个表Phone,其值为

(Name, Number)
--------------
(John, 123)
(John, 456)
(Bravo, 789)
(Ken, 741)
(Ken, 589)

如果问题是找到只使用一个数字的人,答案是 Bravo。

我使用aggregate 函数解决了这个问题。但是不使用聚合函数我不知道如何解决。

【问题讨论】:

    标签: sql aggregate-functions relational-algebra


    【解决方案1】:

    这是我的解决方案:

    SELECT *
    FROM test t
    WHERE NOT EXISTS (
            SELECT 1
            FROM test
            WHERE NAME = t.NAME
                AND number <> t.number);
    

    还有一个示例SQLFiddle

    我不确定关系代数中的这种表示(它很可能不正确或不完整,但它可能会给你一个起点):

    RESULT = {(name, number) ∈ TEST | (name, number_2) ¬∃ TEST, number &lt;&gt; number_2}

    (这是主要思想,你可能会尝试和have a look here 尝试正确地重写它,因为我已经有 10 多年没有写过任何关系代数的东西了)。

    或者您可能正在寻找不同类型的表示,like this one here

    【讨论】:

      【解决方案2】:

      您可以使用 LEFT JOIN 并在您的 JOIN 中使用同一张表,就像这样..

          SELECT a.NAME, a.NUMBER FROM test a 
          LEFT JOIN test b ON a.name = b.name AND a.number <> b.number
          WHERE b.name IS NULL;
      

      希望这会有所帮助。 :)

      【讨论】:

        【解决方案3】:

        如果您使用的是 Access-SQL,请尝试以下操作 -

        SELECT Name
        FROM Phone
        GROUP BY Name
        HAVING COUNT(Name) = 1;
        

        要不然试试-

        SELECT Name
        FROM Phone
        WHERE COUNT(Name) = 1;
        

        如果您有任何问题,请随时回复。

        【讨论】:

          【解决方案4】:

          您可以利用如下所示的 RANK() 函数。

          SELECT * FROM @Tbl WHERE Name NOT IN(
          SELECT Name FROM (
          SELECT  Name, RANK() OVER(PARTITION BY Name ORDER BY Id) AS Rank
          FROM @Tbl) t
          WHERE t.Rank > 1)
          

          此方法的唯一缺点是,您需要使用表中的唯一 id 才能获得正确的结果。

          SQLFiddle

          【讨论】:

            【解决方案5】:

            另一种方法是:

            select Name from Phone p
            where (select name from Phone p2 where p.name = p2.name and p2.number <> p.number limit 1) is null
            

            编辑:添加限制 1 以确保子选择返回标量

            【讨论】:

            • 空结果集与 NULL 不同,因为我希望您的 WHERE 中的 SELECT 返回“无”,对吗?
            • 我猜你可能是对的。也许这只是工作,因为 PostgreSQL 对我很好,并且在我使用“is null”时假定一个标量
            • 可能,我没有使用过 PostgreSQL,主要是 SQL Server。此外,如果您希望 SELECT 的结果没有任何意义,那么限制为 1 是没有意义的。
            • 如果没有限制 1,我们可能会返回一个结果集而不是一个标量(例如,如果我们向 John 添加了一个数字),那么即使在 PostgreSQL 中,查询也会失败。
            猜你喜欢
            • 1970-01-01
            • 2018-04-01
            • 2017-09-17
            • 1970-01-01
            • 1970-01-01
            • 2013-12-03
            • 2010-11-23
            相关资源
            最近更新 更多