我们说我有下表。
给定3个用户名和一个公司名称,我需要检查具有给定公司名称的user1,具有相同公司名称的user2和具有相同给定公司名称的user3是否都在表中。如果他们都在桌子上,我的程序将返回ture。如果其中一个不在表中,则返回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 :(得分: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显示给用户和公司,而不仅仅是示例中的公司。
答案 1 :(得分: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
代替。
答案 2 :(得分: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
答案 3 :(得分: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