SQL - 仅从表1获取结果,表2中的所有行都满足条件为真

时间:2018-04-17 15:15:21

标签: sql-server-2014

好的,所以这看起来很简单,但它让我感到困惑,我无法找到我在网上寻找的东西。 它可能非常简单,我只是度过了漫长的一天,无法让它发挥作用。

我有2个表:variant_detail,variant_setting

样本数据:

+--------------------------+-----------------------+
| variant_detail.vad_pd_id | variant_detail.vad_id | 
+--------------------------+-----------------------+
| 3                        | 3                     |
| 18                       | 25                    |
| 3                        | 69                    |
| 5789                     | 8954                  |
| 89                       | 254                   |
| 1880                     | 6987                  |
| 246                      | 879                   |
| 5789                     | 774                   |
+--------------------------+-----------------------+

+----------------------------+------------------------------------------+
| variant_setting.vas_vad_id | variant_setting.vas_discontinued_product |
+----------------------------+------------------------------------------+
| 3                          | TRUE                                     |
| 25                         | TRUE                                     |
| 69                         | FALSE                                    |
| 8954                       | TRUE                                     |
| 254                        | FALSE                                    |
| 6987                       | FALSE                                    |
| 879                        | FALSE                                    |
| 774                        | TRUE                                     |
+----------------------------+------------------------------------------+

我想要获得的只是行vad_pd_id,其中variant_setting.vas_discontinued_product = TRUE。

这不是标准联接,因为并非所有变体都将停止使用。我尝试过Distinct和各种各样的! 例如。 vad_pd_id = 3没有条目,因为一行为TRUE,一行为FALSE 但是,vad_pd_id = 5789会有一个条目,因为两行都是TRUE

以下是我拍摄的代码:
Select distinct vad_pd_id From variant_detail Inner Join variant_setting On variant_detail.vad_id = variant_setting.vas_vad_id where variant_setting.vas_discontinued_product = TRUE

期待所有技术人员的一些帮助!

修改

我现在需要更新一个单独的表:product_analysis。字段是pa_pd_id
所以代码类似于

update update product_analysis set product_analysis.pa_l_9 =1 *using the select function just created

2 个答案:

答案 0 :(得分:0)

试试这个:

select vad_pd_id from variant_detail inner join variant_setting on variant_detail.vad_id = variant_setting.vas_vad_id group by vad_pd_id having bool_and(vas_discontinued_product) is true

它将返回值5789和18 - 这是唯一具有所有TRUE的值...

答案 1 :(得分:0)

请参阅bool_and汇总函数(documentation)。

  

如果所有输入值都为true,则为true,否则为false

您需要汇总vas_discontinued_product值并使用bool_and()。所以删除WHERE子句:

where variant_setting.vas_discontinued_product = TRUE

并添加:

GROUP BY vad_pd_id
HAVING bool_and(variant_setting.vas_discontinued_product)

您不必为布尔条件添加= TRUE

修改

事实证明这不是PostgreSQL,你不能使用bool_and。但是有一种替代方法可以使用(我希望)所有SQL 风格

boolean投射到int并使用min聚合函数。 FALSE::int = 0TRUE::int = 1,如果min返回1,则表示所有值为TRUE

GROUP BY vad_pd_id
HAVING min(CAST(variant_setting.vas_discontinued_product AS integer)) = 1