2015-10-05 82 views
0

關係代數我們有一個表,電話,其值是沒有聚合函數

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

如果問題是找到誰只使用一個號碼的人,答案是布拉沃。

我使用aggregate函數解決了這個問題。但我不知道如何解決不使用聚合函數。

回答

4

這裏是我的解決方案:

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

+0

感謝您的回答。但你能幫我解答一下嗎?w.r.t關係代數 –

+0

@SethuramanSrinivasan不幸的是,我不知道關係代數中的符號來表達這一點。 –

-1

做的另一種方法是:

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,以確保子選擇返回標

+0

空的結果集與NULL不同,因爲我期待'WHERE'中的'SELECT'返回「Nothing」,對嗎? –

+0

我想你可能是對的。也許這只是因爲PostgreSQL對我很好,並假設我使用「is null」時的標量 – Zalzero

+0

可能是,我沒有使用過PostgreSQL,主要是SQL Server。另外,如果你期待SELECT的結果是什麼,那麼限制到1就沒有意義了。 –

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; 

希望這有助於。 :)

0

請嘗試以下,如果你使用的是Access,SQL -

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

否則,請嘗試 -

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

如果您有任何疑問,那麼請隨時回覆。

0

您可以利用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