2017-05-25 81 views
1

以前已经问过很多次,但我无法理解以前的解决方案并将它们实现到我自己的查询中。 (我非常仍然是一个SQL新手。)SQL - 根据另一个表中的限制结果,基于另一个表中的条件

我有以下查询:

select * 
from **Product** prod 
inner JOIN 
**account** acct on prod.product_id = acct.product_id 
inner JOIN 
**client_account_relationship** car on acct.account_id = car.ACCOUNT_ID 
inner JOIN 
**client** cl on car.client_id = cl.client_id 
where prod.product_code != 'Producttype' 

我的表结构如下:

产品 - 该表包含客户帐户持有什么样的产品

账户 - 该表保存客户持有

客户帐户的关系如何解释 - 该表保存客户之间的联系ND占

客户端 - 该表保存客户

A产品将始终有一个帐户,帐户将永远有一个客户端/客户关系,和客户端/客户的关系将始终有一个客户端。

我想显示所有不包含特定产品类型的客户端。 I.e向我展示所有不持有ProductType1的客户端。但是因为客户可以拥有许多不同的产品类型,所以我的查询会向我显示除我不包括的产品之外的所有产品,但客户可能仍然持有排除的产品。

如何根据另一个表中设置的条件限制客户端表的结果?

+1

你肯定是缺少几个联接,你映射在查询所有的FKS? –

回答

0

使用NOT IN声明。 Not in要求SQL特别排除那些product types符合条件的where条件sub query

select distinct car.client_id 
from **Product** prod 
inner JOIN 
**account** acct on prod.product_id = acct.product_id 
inner JOIN 
**client_account_relationship** car on acct.account_id = car.ACCOUNT_ID 
inner JOIN 
**client** cl on car.client_id = cl.client_id 
where car.client_id not in 
(select car.client_id 
from **Product** prod 
inner JOIN 
**account** acct on prod.product_id = acct.product_id 
inner JOIN 
**client_account_relationship** car on acct.account_id = car.ACCOUNT_ID 
inner JOIN 
**client** cl on car.client_id = cl.client_id 
where prod.product_code != 'ProductType1' 
) 
+0

这两个解决方案都很完美,但第二个解决方案对我更有帮助,因为它保持了连接数据的完整性,这是额外的字段信息所需的。我想我现在开始明白如何使用不存在和不使用英寸他们似乎都做同样的事情,但是有一个理由,其中一个会比另一个更好使用? – Dekks

+0

我使用不是在大多数时间,因为我直接引用该列,我不需要在声明中,在我的经验工作比不存在处理所有列 –

0

SQL作为一种描述性语言的好处在于它可以很好地翻译英文。您已经描述了您想要做的事情 - 找到所有没有特定产品的客户。转换为SQL,这将是[not] exists操作:

SELECT * 
FROM client c 
WHERE NOT EXISTS (SELECT * 
        FROM product p 
        JOIN account a ON p.product_id = a.product_id 
        JOIN client_account_relationship car ON 
          a.account_id = car.ACCOUNT_ID 
        WHERE car.client_id = c.client_id AND 
          p.product_code = 'Producttype') 
相关问题