(连接表规范化模式)选择WHERE [x]和WHERE [Y]的SQL语句

时间:2017-10-24 14:12:25

标签: sql postgresql join amazon-redshift

我有一个由两个表组成的规范化sql db,让我们称之为<CORSConfiguration> <CORSRule> <AllowedOrigin>*</AllowedOrigin> <AllowedMethod>GET</AllowedMethod> <AllowedMethod>HEAD</AllowedMethod> <!-- Add this --> <MaxAgeSeconds>3000</MaxAgeSeconds> <AllowedHeader>Authorization</AllowedHeader> </CORSRule> </CORSConfiguration>Users,每个用户都有很多车,每辆车都属于一个用户,现在我想要获得欠两个(或更多)特定型号汽车的所有用户,伪:Cars

这可以让所有拥有每个型号汽车的用户:

select all users (join cars) that owe car model X and car model Y

但我想只获得拥有这两款车的用户,我尝试使用("""SELECT * FROM users use JOIN cars car ON use.user_id = car.user_id WHERE (car.model = 'X' AND car.maker = 'XX') OR (car.model = 'Y' AND car.maker = 'YY');""") 代替AND,但这并不会返回任何结果

2 个答案:

答案 0 :(得分:1)

您可以通过执行以下操作获取用户ID:

SELECT c.user_id
FROM cars c
WHERE (c.model, c.maker) in ( ('X', 'XX'), ('Y', 'YY') )
GROUP BY c.user_id
HAVING COUNT(DISTINCT c.model) = 2;

您可以使用joininexists来提供有关用户的更多信息。

此语法使用in为您的逻辑使用简写。当然,明确的and / or逻辑也可以。

以上http://sqlfiddle.com/#!9/669f6c/1

上的SQLFiddle

答案 1 :(得分:1)

select 
  u.* 
from 
  users u 
where 
  exists (select 1 from cars c where c.maker = "Ford" and c.model='Mustang' and u.id = 
    c.user_id)
  and exists (select 1 from cars c where c.maker = "Chevy" and c.model='Camaro' and u.id = 
    c.user_id)