SQL 查询以获取具有相同状态的结果集
SQL query to fetch the result set with same status
table1如下,
ID
FK1_ID
FK2_ID
1
1
1
2
1
2
3
1
3
FK2的table如下,
ID
Type
Status
1
Type1
True
2
Type2
True
3
Type1
False
FK2_ID列是table2.
的ID列
预期的结果是,对于任何 FK1_ID(我有一个 ID 列表),需要在 Type1 的第二个 table 和状态 True 中检查其所有 FK2 条目。
例如:
在这里,我想 return YES,如果特定 FK1_ID 的所有 Type1 条目都是 True。其他编号
因此,对于 FK1_ID 和 1,FK2 table 有 3 条记录。其中Type1有2条记录。我应该 return YES,如果两个 Type1 记录都是 True,否则 NO。
我想使用 SQL 完成此操作。
感谢任何帮助?
我并不完全遵循你的逻辑(这两个表是如何连接的)但听起来你想比较总计数和条件计数所以可能是这样的
with t as (select type, count(status) as cnt,
sum(case when status ='True' then 1 else 0 end) as truecnt
from FK2
group by type)
select type, case when truecnt > 0 and cnt = truecnt then 'Yes' else 'No' end as MyResult
from t
看来您只需要将条件计数 Status
与完整计数进行比较,最终结果为 CASE
。
SELECT
t1.FK1_ID,
Result = CASE WHEN COUNT(*) = COUNT(CASE WHEN FK2.Status = 'True' THEN 1 END)
THEN 'Yes'
ELSE 'No' END
FROM table1 t1
JOIN FK2 ON FK2.ID = t1.FK2_ID
AND FK2.Type = 'Type1'
GROUP BY
t1.FK1_ID;
一个略短但不太容易理解的版本
CASE WHEN COUNT(*) = COUNT(NULLIF(FK2.Status, 'False'))
或者
CASE WHEN COUNT(NULLIF(FK2.Status, 'True')) = 0
table1如下,
ID | FK1_ID | FK2_ID |
---|---|---|
1 | 1 | 1 |
2 | 1 | 2 |
3 | 1 | 3 |
FK2的table如下,
ID | Type | Status |
---|---|---|
1 | Type1 | True |
2 | Type2 | True |
3 | Type1 | False |
FK2_ID列是table2.
的ID列预期的结果是,对于任何 FK1_ID(我有一个 ID 列表),需要在 Type1 的第二个 table 和状态 True 中检查其所有 FK2 条目。
例如: 在这里,我想 return YES,如果特定 FK1_ID 的所有 Type1 条目都是 True。其他编号
因此,对于 FK1_ID 和 1,FK2 table 有 3 条记录。其中Type1有2条记录。我应该 return YES,如果两个 Type1 记录都是 True,否则 NO。
我想使用 SQL 完成此操作。 感谢任何帮助?
我并不完全遵循你的逻辑(这两个表是如何连接的)但听起来你想比较总计数和条件计数所以可能是这样的
with t as (select type, count(status) as cnt,
sum(case when status ='True' then 1 else 0 end) as truecnt
from FK2
group by type)
select type, case when truecnt > 0 and cnt = truecnt then 'Yes' else 'No' end as MyResult
from t
看来您只需要将条件计数 Status
与完整计数进行比较,最终结果为 CASE
。
SELECT
t1.FK1_ID,
Result = CASE WHEN COUNT(*) = COUNT(CASE WHEN FK2.Status = 'True' THEN 1 END)
THEN 'Yes'
ELSE 'No' END
FROM table1 t1
JOIN FK2 ON FK2.ID = t1.FK2_ID
AND FK2.Type = 'Type1'
GROUP BY
t1.FK1_ID;
一个略短但不太容易理解的版本
CASE WHEN COUNT(*) = COUNT(NULLIF(FK2.Status, 'False'))
或者
CASE WHEN COUNT(NULLIF(FK2.Status, 'True')) = 0