没有聚合函数的关系代数

Relational algebra without aggregate function

我们有一个tablePhone,其值为

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

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

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

这是我的解决方案:

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 <> number_2}

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

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

另一种方法是:

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 以确保 sub select returns 是标量

您可以使用 LEFT JOIN 并在您的 JOIN 中使用相同的 table ,像这样..

    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;

希望这对您有所帮助。 :)

如果您使用的是 Access-SQL -

,请尝试以下操作
SELECT Name
FROM Phone
GROUP BY Name
HAVING COUNT(Name) = 1;

否则,尝试-

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

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

您可以利用如下所示的 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)

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

SQLFiddle