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 <>3
这将给出没有 3 和 4 的结果
【讨论】:
以上是关于SQL 选择以消除在下一列中具有 2 个其他值的重复值的主要内容,如果未能解决你的问题,请参考以下文章