2017-05-02 84 views
0

我知道标题不是很清楚,所以我很抱歉 - 但我需要一些帮助。选择具有特定值的唯一标识符

我有下面的数据表:

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 

我需要过滤掉任何GROUP_ID的不具有具有main_contact_flag设置为1

因此所需的输出将一个CONTACT_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

一个简单的方法有什么数据类型为MAIN_CONTACT_FLAG?您应该始终包含表定义以及RDBMS和版本。 –

回答

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 

UPDATE:

你需要区分布尔(位)至数为总和

使用SUM(CASE WHEN MAIN_CONTACT_FLA G = 0 THEN 0 ELSE 1 END)

+0

你好,谢谢你的回复。如果我执行了其中一个查询,则会出现此错误:操作数数据类型位对于求和运算符无效。 – dgoodwin

+0

答案已被更新 – StanislavL

0

尝试这种情况:

select * from 
(
    select *,max(MAIN_CONTACT_FLAG) over (partition by GROUP_ID) as final_flag 
    from tablename 
) 
where final_flag=0; 
0

尝试:可以通过使用子查询

select * 
from #tmp 
where group_id not in (select distinct group_id from #tmp where main_contact_flag = 1) 

OR 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) 
实现期望的输出
0

您需要这个

SQLFiddle

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) 
+0

您好,我有一些测试后,但想你的查询,它通过群组ID确实有MAIN_CONTACT_FLAG设置为1,但没有显示在输出查询 – dgoodwin

+0

这些记录,我建议你复制在同一拉小提琴,我给了,所以我可以找出它在哪里突破。 – Utsav

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_FLAGboolean NOT NULL,有与aggregate function bool_or()

SELECT group_id 
FROM contact_group_contacts_t 
GROUP BY 1 
HAVING NOT bool_or(main_contact_flag);