好的,所以这看起来很简单,但它让我感到困惑,我无法找到我在网上寻找的东西。 它可能非常简单,我只是度过了漫长的一天,无法让它发挥作用。
我有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
答案 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 = 0
和TRUE::int = 1
,如果min
返回1
,则表示所有值为TRUE
。
GROUP BY vad_pd_id
HAVING min(CAST(variant_setting.vas_discontinued_product AS integer)) = 1