2011-10-26 41 views
0

我有下面的SQL代碼:SQL:使用EXISTS()與其他一些命令

SELECT m.email 
FROM members as m 
WHERE exists 
(
select * 
from posts as p 
where p.email = m.email 
) 
order by ads desc 

我要添加另一份聲明之前, 「存在」,讓我有類似

SELECT m.email 
FROM members as m 
WHERE 
(m.ads<>0) 
and 
exists 
(
select * 
from posts as p 
where p.email = m.email 
) 
order by ads desc 

但它不起作用,以及ads<>'0',ads<>('0'),m.ads<>0

爲什麼你認爲它不工作?

「不工作」我的意思是,當我添加一行'ads <> 0'時,查詢結果沒有變化(就像我沒有輸入這行)。 如果我添加一行'ads = 0'而不是 - 它會給出空的結果,就好像沒有字段的值爲零(實際上確實存在)

+1

定義「不起作用」。你有沒有收到任何錯誤信息? – Phil

+4

然後,您的查詢或數據是錯誤的,您可能完全刪除問題中的'EXISTS'。你是否試圖用_just_'ads <> 0'的條件?將事物縮小到最小的測試用例是一項至關重要的調試技術。 –

+0

聽起來好像沒有'ads == 0' **的記錄**和'posts'中的匹配記錄** – Phil

回答

1

您應該能夠添加儘可能多的邏輯如您所願,您的WHERE聲明的條款。

假設members.ads是一個整數數據類型...

SELECT m.email 
FROM members m 
WHERE m.ads <> 0 
AND EXISTS (
    SELECT 1 
    FROM posts p 
    WHERE p.email = m.email 
) 
ORDER BY m.ads DESC 
0

你應該能夠使用EXISTS爲你呈現。你也可以把它寫成一個連接,當然:

SELECT DISTINCT m.email 
    FROM members AS m 
    JOIN posts AS p ON p.email = m.email 
WHERE (m.ads<>0) 
ORDER BY ads DESC 

或者,你可能會決定使用一個子查詢來倒推「獨特」的操作:

SELECT m.email 
    FROM members AS m 
    JOIN (SELECT DISTINCT p.email FROM posts AS p) AS q ON q.email = m.email 
WHERE (m.ads<>0) 
ORDER BY ads DESC 

只能有成員表中每個單獨的電子郵件地址最多一個結果;如果您允許多個成員共享一個電子郵件地址,您可能仍然需要在外部查詢上使用DISTINCT。

但是,爲了重申開放點,您應該能夠像顯示的那樣在其他子句中使用EXISTS運算符。

相關問題