我知道标题不是很清楚,所以我道歉 - 但我需要一些帮助。
我已经得到了以下数据表:
GROUP_ID CONTACT_ID MAIN_CONTACT_FLAG
11000 28789 0
11000 28049 1
21890 10086 0
21890 10554 0
21489 14785 0
21464 12457 1
21654 14558 0
我需要过滤掉任何没有将main_contact_flag设置为1的contact_id的group_id
所以期望的输出是:
GROUP_ID CONTACT_ID MAIN_CONTACT_FLAG
21890 10086 0
21890 10554 0
21489 14785 0
21654 14558 0
我尝试了以下查询,但没有一个能给我我需要的结果:
SELECT GROUP_ID,MAIN_CONTACT_FLAG FROM Contact_Group_Contacts_T
WHERE MAIN_CONTACT_FLAG != 0 AND MAIN_CONTACT_FLAG != 1
ORDER BY Group_ID DESC
SELECT DISTINCT GROUP_ID,Main_Group_Contact_BT
FROM Contact_Group_Contacts_T
WHERE NOT EXISTS (SELECT * FROM Contact_Group_Contacts_T WHERE MAIN_CONTACT_FLAG IN (0,1))
提前致谢, 丹
答案 0 :(得分:1)
SELECT * FROM Contact_Group_Contacts_T t INNER JOIN
(SELECT GROUP_ID
FROM Contact_Group_Contacts_T
GROUP BY GROUP_ID
HAVING SUM(MAIN_CONTACT_FLAG)=0) sub ON t.GROUP_ID=sub.GROUP_ID
或者,如果您只需要组ID
SELECT GROUP_ID
FROM Contact_Group_Contacts_T
GROUP BY GROUP_ID
HAVING SUM(MAIN_CONTACT_FLAG)=0
更新:
你需要将boolean(bit)设置为要求和的数字
使用SUM(MAIN_CONTACT_FLAG = 0然后0结束时的情况)
答案 1 :(得分:1)
你是许多方式。
您的NOT EXISTS
变体适用于大多数RDBMS,并添加了以下内容:
SELECT DISTINCT GROUP_ID
FROM Contact_Group_Contacts_T T1
WHERE NOT EXISTS (
SELECT * FROM Contact_Group_Contacts_T T2
WHERE T2.GROUP_ID = T1.GROUP_ID -- the missing piece!
AND T2.MAIN_CONTACT_FLAG = 1);
在 PostgreSQL 中,假设MAIN_CONTACT_FLAG
为boolean NOT NULL
,aggregate function bool_or()
有一个简单的方法
SELECT group_id
FROM contact_group_contacts_t
GROUP BY 1
HAVING NOT bool_or(main_contact_flag);
答案 2 :(得分:0)
试试这个:
select * from
(
select *,max(MAIN_CONTACT_FLAG) over (partition by GROUP_ID) as final_flag
from tablename
)
where final_flag=0;
答案 3 :(得分:0)
尝试这个:您可以使用子查询
来获得所需的输出select *
from #tmp
where group_id not in (select distinct group_id from #tmp where main_contact_flag = 1)
或NOT EXISTS
select t.*
from #tmp t
where not exists (select 1
from #tmp t1 where t.group_id = t1.group_id and t1.main_contact_flag = 1)
答案 4 :(得分:0)
你需要这个
select * from table1 t1
where not exists
(select 1 from table1 t2
where t1.group_id=t2.group_id
and t2.MAIN_CONTACT_FLAG = 1)