SQL 选择以消除在下一列中具有 2 个其他值的重复值

Posted

技术标签:

【中文标题】SQL 选择以消除在下一列中具有 2 个其他值的重复值【英文标题】:SQL select to eliminate duplicate value that has 2 other values in next column 【发布时间】:2013-12-31 07:29:09 【问题描述】:

我已经构建了一个像这样的连接表。

表名:我的表

p_id | c_id
-----------
1     1
1     2
1     3
2     2    
2     3
3     2
3     3
3     4

我想选择不具有 c_id 3 和 4 的 p_id。在这种情况下,只有 p_id 3 同时具有 c_id 3 和 4,因此在 select 语句之后查询应该返回 p_id 1 和 2。 问题是我尝试了不同的方法,但仍然行不通。我真的需要帮助。

我的查询

1.) SELECT DISTINCT p_id FROM myTable WHERE c_id != 3 AND course_id != 4;

问题:它仍然返回 3 作为结果之一,因为 3 的 c_id 为 2

【问题讨论】:

首先我必须在这里强调您在查询中使用的条件是针对不在表中的 course_id 字段。 【参考方案1】:

类似这样的:

SELECT DISTINCT p_id 
FROM   mytable 
WHERE  p_id NOT IN (SELECT p_id 
                    FROM   mytable 
                    WHERE  c_id IN ( 3, 4 ) 
                    GROUP  BY p_id 
                    HAVING Count(DISTINCT c_id) = 2)

SQLFiddle demo

【讨论】:

【参考方案2】:

试试这个:

SELECT DISTINCT p_id 
FROM myTable 
WHERE c_id IN (3,4) 
GROUP BY p_id HAVING COUNT(DISTINCT c_id)<2

【讨论】:

此查询不返回 p_id,它根本没有 3 或 4。【参考方案3】:

直接的解决方案是使用exists

  select 
distinct p_Id
    from myTable t
   where not (exists (select 1
                        from myTable
                       where (c_id = 3) and
                             (p_id = t.p_id)) and 
              exists (select 1
                        from myTable
                       where (c_id = 4) and
                             (p_id = t.p_id)))

【讨论】:

【参考方案4】:

试试这个:

SELECT mytable.p_id 
FROM   mytable 
       LEFT OUTER JOIN (SELECT v1.p_id 
                        FROM   (SELECT p_id 
                                FROM   mytable 
                                WHERE  c_id = 3) v1 
                                INNER JOIN (SELECT p_id 
                                            FROM   mytable 
                                           WHERE  c_id = 4) v2 
                                       ON v1.p_id = v2.p_id) v 
                    ON mytable.p_id = v.p_id 
WHERE  v.p_id IS NULL 
GROUP  BY mytable.p_id 

【讨论】:

【参考方案5】:

试试这个:

select distinct mytable.p_id from mytable where c_id not in (3,4) and p_id &lt;&gt;3

这将给出没有 3 和 4 的结果

【讨论】:

以上是关于SQL 选择以消除在下一列中具有 2 个其他值的重复值的主要内容,如果未能解决你的问题,请参考以下文章

SQL:如何为一列中具有重复值的每组行选择一行?

SQL查询以选择在同一列中具有不同值的子记录的父级

sql查询以选择两列中具有相同id但不同值的记录

查找一列中具有相同值而另一列中具有其他值的行?

如何编写sql查询以选择一列中具有最大值的行

SQL - 选择两列中具有相同值的行