2014-05-06 18 views
1

我明天參加考試,練習考試的其中一個問題是顯示給定查詢提供的輸出。所以我運行了一個工作副本數據庫,並遵循相同的語法。使用次數(*)並存在

下面是數據:

SELECT vendor_id, name FROM Vendor; 
+-----------+--------------+ 
| vendor_id | name   | 
+-----------+--------------+ 
|   1 | Tiger Direct | 
|   2 | Newegg  | 
|   3 | Micro Center | 
+-----------+--------------+ 

給出的查詢是:

SELECT vendor_id, COUNT(*) FROM Vendor v1 
WHERE EXISTS(SELECT * FROM Vendor v2 WHERE v2.vendor_id<>v1.vendor_id) GROUP BY vendor_id; 
+-----------+----------+ 
| vendor_id | COUNT(*) | 
+-----------+----------+ 
|   1 |  1 | 
|   2 |  1 | 
|   3 |  1 | 
+-----------+----------+ 

但是當我運行只是究竟是在檢查我得到的存在表格:

SELECT v1.vendor_id FROM Vendor v1, Vendor v2 WHERE v1.vendor_id <> v2.vendor_id; 
+-----------+ 
| vendor_id | 
+-----------+ 
|   2 | 
|   3 | 
|   1 | 
|   3 | 
|   1 | 
|   2 | 
+-----------+ 

所以我的問題是:
如何來計數是不是2,而不是1?

我很抱歉如果這是一個愚蠢的問題,但我正在學習SQL的過程中,這個問題讓我難住了。

編輯:

我收到的答案是偉大的,但現在我要問:

Attends: 
SSN   NUMBER 
123456789  670 
123456789  680 
891234567  680 
234567891  670 

這是什麼查詢想出:

select SSN, count(*), avg(Number) from Attends S1 
where exists 
    (select * from Attends S2 where S1.SSN <> S2.SSN) group by SSN 

我現在明白了,數(*)將永遠是一個,因爲只有4個不同的元組,但是這對AVG(Number)有什麼影響。有沒有什麼東西實際上是平均值,或者只是返回原始數字。

+0

我想讓你知道隱式連接像這樣'FROM Vendor v1,Vendor v2 WHERE v1.vendor_id <> v2.vendor_id'並不是最好的實踐,而是顯式連接像'FROM Vendor v1 INNER JOIN Vendor v2 ON v1.vendor_id <> v2.vendor_id '更好的做法 – AeroX

回答

2

您的連接將返回不匹配的每一行並將它們連接在一起,將您的結果數量相乘,但如果存在不這樣做,則應用減少而不更改內存中的結果。

SELECT v1.vendor_id, v2.vendor_id v2id FROM Vendor v1, Vendor v2 WHERE v1.vendor_id <> v2.vendor_id; 

+-----------+-----------+ 
| vendor_id | v2id  | 
+-----------+-----------+ 
|   2 |   1 | 
|   3 |   1 | 
|   1 |   2 | 
|   3 |   2 | 
|   1 |   3 | 
|   2 |   3 | 
+-----------+-----------+ 
+0

謝謝你的迴應。它絕對爲我清理了一些東西 – user3552703

0

如果行存在於子查詢中,則包含該行。由於原表中只有3行,並且沒有加入任何內容,因此總行數只有3,因此每個ID的計數爲1.

相關問題