选择具有特定值的唯一标识符

时间:2017-05-02 11:54:35

标签: sql

我知道标题不是很清楚,所以我道歉 - 但我需要一些帮助。

我已经得到了以下数据表:

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

提前致谢, 丹

5 个答案:

答案 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_FLAGboolean NOT NULLaggregate 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)

你需要这个

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)