關係代數我們有一個表,電話,其值是沒有聚合函數
(Name, Number)
--------------
(John, 123)
(John, 456)
(Bravo, 789)
(Ken, 741)
(Ken, 589)
如果問題是找到誰只使用一個號碼的人,答案是布拉沃。
我使用aggregate
函數解決了這個問題。但我不知道如何解決不使用聚合函數。
關係代數我們有一個表,電話,其值是沒有聚合函數
(Name, Number)
--------------
(John, 123)
(John, 456)
(Bravo, 789)
(Ken, 741)
(Ken, 589)
如果問題是找到誰只使用一個號碼的人,答案是布拉沃。
我使用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,以確保子選擇返回標
空的結果集與NULL不同,因爲我期待'WHERE'中的'SELECT'返回「Nothing」,對嗎? –
我想你可能是對的。也許這只是因爲PostgreSQL對我很好,並假設我使用「is null」時的標量 – Zalzero
可能是,我沒有使用過PostgreSQL,主要是SQL Server。另外,如果你期待SELECT的結果是什麼,那麼限制到1就沒有意義了。 –
您可以使用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;
希望這有助於。 :)
請嘗試以下,如果你使用的是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)
該方法的唯一缺點是,您需要使用表中唯一的ID來獲得正確的結果。
感謝您的回答。但你能幫我解答一下嗎?w.r.t關係代數 –
@SethuramanSrinivasan不幸的是,我不知道關係代數中的符號來表達這一點。 –