SQL - 仅获取来自 table 1 的结果,其中 table 2 上的所有行都满足条件 true

SQL - Get results only results from table 1, where all rows on table 2 meet condition true

好的,这看起来很简单,但它让我很困惑,我无法在网上找到我要找的东西。 它可能真的很简单,我刚刚度过了漫长的一天,无法让它工作。

我有 2 个 table: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

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

编辑

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

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

试试这个:

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

它会 return 值 5789 和 18 - 这是唯一全部为 TRUE 的值...

参见 bool_and 聚合函数 (documentation)。

true if all input values are true, otherwise 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 flavors:

boolean 转换为 int 并使用 min 聚合函数。 FALSE::int = 0TRUE::int = 1,所以如果 min returns 1 这意味着 所有 值都是 TRUE

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