SQL - 根据另一个表中指定的条件限制一个表的结果

时间:2017-05-25 08:06:05

标签: mysql sql database join

以前曾多次询问过这个问题,但我无法理解以前的解决方案并将其实现到我自己的查询中。 (我仍然是一个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'

我的表格结构如下:

产品 - 此表包含客户帐户持有的产品

帐户 - 此表包含客户持有的帐户

客户帐户关系 - 此表包含客户和帐户之间的链接

客户端 - 此表包含客户端

产品将始终拥有帐户,帐户将始终拥有客户/帐户关系,客户/帐户关系将始终拥有客户。

我想显示所有不包含特定产品类型的客户。即向我展示所有未持有ProductType1的客户端。但是因为客户可以容纳许多不同的产品类型,我的查询会显示除了我排除的产品之外的所有产品,但客户可能仍然持有该被排除的产品。

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

2 个答案:

答案 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')

答案 1 :(得分:0)

使用NOT IN声明。 Not in要求SQL专门排除符合product types

where条件中条件的sub queryselect 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' )
AFSSLPinningModeNone