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 = 0
和 TRUE::int = 1
,所以如果 min
returns 1
这意味着 所有 值都是 TRUE
。
GROUP BY vad_pd_id
HAVING min(CAST(variant_setting.vas_discontinued_product AS integer)) = 1
好的,这看起来很简单,但它让我很困惑,我无法在网上找到我要找的东西。 它可能真的很简单,我刚刚度过了漫长的一天,无法让它工作。
我有 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 = 0
和 TRUE::int = 1
,所以如果 min
returns 1
这意味着 所有 值都是 TRUE
。
GROUP BY vad_pd_id
HAVING min(CAST(variant_setting.vas_discontinued_product AS integer)) = 1