2014-08-28 35 views
0

假設我有下表。sql如何檢查db中存在的多個數據

enter image description here

鑑於3的用戶名和一個公司的名字,我需要檢查,如果用戶1與給定的公司名稱,用戶2與同一給定的公司名稱和用戶3與同一給定的公司名稱都是在表。如果他們都在桌子上,我的程序就會返回。如果其中一個不在表格中,則返回false。

例如:

  • 給用戶A,B,E和公司沃爾瑪,我的程序應該返回 假。

  • 給出用戶C,D,E和公司的谷歌,我的程序應該返回 爲真。

什麼是最有效的sql來完成它? 我現在所能想到的是,每個用戶都要與給定的公司進行一次檢查。

e.g. 
    select * from [table] where user = '[given user1]' 
       and company = '[given company name]' 

    select * from [table] where user = '[given user2]' 
       and company = '[given company name]' 

    select * from [table] where user = '[given user3]' 
       and company = '[given company name]' 

完全我需要訪問數據庫每次檢查3次。我不認爲這是一個好方法。

P.S.我爲此使用SQL SERVER,但我更喜歡使用正常/通用的sql語句,如果可能的話,它可適用於大多數不同的數據庫。 在此先感謝。

+0

大多數SQL服務器產品支持發送一批SQL作爲一個事務,最SQL服務器產品非常有效地編譯和緩存相似的查詢。因此,如果發送三個查詢會導致從長遠角度理解代碼變得更簡單,那麼沒有任何問題。想想下一個人! – TFD 2014-08-28 20:10:16

回答

0

您可以使用MIN()CASE做到這一點:

SELECT MIN(CASE WHEN company = 'walmart' THEN 'True' ELSE 'False' END) 
FROM Table1 
WHERE users IN ('a','b','e') 
--False 

SELECT MIN(CASE WHEN company = 'google' THEN 'True' ELSE 'False' END) 
FROM Table1 
WHERE users IN ('c','d','e') 
--True 

如果比較值存儲在一個表,你可以使用相同的一個JOIN來代替。

0

你應該用一個案例:

select CASE when user = '[given user1]' and company = '[given company name]' then "true" end as [company name], CASE when user = '[given user2]' and company = '[given company name]' then "true" end as [company name2] 
    from [table] 

,您可以根據需要儘可能多的公司名稱做到這一點。而且,您總是可以將結果CONCAT顯示給用戶和公司,而不僅僅是本示例中的公司。

0
SELECT CASE WHEN EXISTS (SELECT * FROM [table] WHERE Company = @Company AND UserName = @UserName1) 
      AND EXISTS (SELECT * FROM [table] WHERE Company = @Company AND UserName = @UserName2) 
      AND EXISTS (SELECT * FROM [table] WHERE Company = @Company AND UserName = @UserName3) 
      THEN 1 ELSE 0 
     END AS HasAll3 
0

我認爲,如果一個用戶使用一個以上的公司上市,你還願意TRUE如果所有與目標公司上市返回。只需在列表中查詢公司和用戶的表格即可。如果您獲得正確的匹配數量,即TRUE,否則FALSE。我不知道你是如何將用戶傳遞給代碼的,或者如果可以有不同數量的代碼,那麼我只需對這些值進行硬編碼,就可以計算出詳細信息。 SQL Fiddle

select case when count(*) = 3 then 1 else 0 end as OutCome 
from table1 
where Company = 'google' 
-- and User in('A', 'B', 'C') --> should return 0 (false) 
-- and User in('C', 'D', 'E') --> should return 1 (true) 
-- and User in('D', 'E', 'F') --> should return 0 (false) 

如果有可能相同的用戶可以與公司多次被列出,你需要「不同」添加到計數。

編輯:我忘了展示,這將工作即使用戶被「登記」與一個以上的公司:SQL Fiddle

相關問題