2014-08-28 73 views
-6

這是一個簡單的where子句從一個表。問題是,我沒有得到任何結果,當我應該。 AND是必要的,因爲兩個條件都必須符合。第二張表格顯示應滿足條件。SQL where子句的奇怪行爲

select * 
from UserPermissions up 
where up.PermissionId = 5 and up.PermissionId = 7 

select * 
from UserPermissions up 
where up.UserId = '40376a15-8b4b-43c0-a174-67f935ec7e8e' 

以下是結果。第一個查詢不返回結果,但選擇2顯示來自特定用戶的結果。第2行和第3行顯示PermissionId應該匹配。

enter image description here

有看起來是對要問什麼,我有些誤解。最有可能的措辭。我期待的是爲每個都有 PermissionID爲5(在一行中)和7(在另一行中)的每個用戶獲取單個UserID。

+3

你'PermissionId'與2個值在同一時間你的第一個查詢,這是不可能的。 – Taryn 2014-08-28 16:42:05

+1

'up.PermissionId'不能同時在一個單行中成爲'5'和'7'!違反了1NF! – KrazzyNefarious 2014-08-28 16:42:07

+1

誰剛下來並標記每個答案都不正確?這根本不酷。 – durbnpoisn 2014-08-28 16:44:08

回答

7

與原始查詢問題是你問到返回結果,其中PermissionId是在同一時間等於兩個值 - 這意味着在同一行 - 這是不可能的。

但是你可以得到回報同時具有PermissionId =5PermissionId =7GROUP BYHAVING子句UserID

SELECT userId 
FROM UserPermissions up 
WHERE PermissionId IN (5, 7) 
GROUP BY userId 
HAVING COUNT(DISTINCT PermissionId) = 2 
+1

我更喜歡你的選擇。 – Zane 2014-08-28 17:17:32

+2

當你檢查擁有3或7或15權限的人時,它確實可以更好地擴展(代碼和性能)...... – 2014-08-28 17:18:37

+0

@blufeet這也很好。我會盡量記住你最初提到的同一行問題。 – 2014-08-28 17:20:35

3

這或自加入會給你正確的結果,權限列中同時具有5和7的用戶。

select up.UserID 
from UserPermissions up 
where up.PermissionId = 5 
and up.UserID in (Select userID 
       FROM UserPermissions up1 
       where up1.PermissionId = 7 
       ) 
+1

但是這隻會返回permissionId = 5的那一行。我不認爲我們理解這個需求還不夠,不知道實際預期的是什麼。 – 2014-08-28 16:48:47

+1

的確足夠了,在問題中做了一些澄清...然而,似乎他確實在尋找合格的userID's,因爲'select *'正在返回那兩列。 – 2014-08-28 16:50:10

5

好吧OP是否可以爲您做任何事情?

select 
    a.UserId 
from UserPermissions as a 
inner join userpermissions as b 
    on a.userID = b.userID 
    and a.permissionID = 5 
    and b.permissionID = 7 
+0

謝謝贊恩。這看起來解決了它。感謝你的幫助。當Zane在你之前發佈的時候,贊恩給了他藍信譽。謝謝。 – 2014-08-28 17:19:22