SQL查询 - 从表中选择不同的值

时间:2013-01-26 19:29:28

标签: sql oracle

我有一张桌子,其中我有一个针对FK的多个条目。我想找出没有特定条目的FK的值,例如 我的表有以下条目。

PK----------------FK-----------------Column entries

1----------------100-----------------ab1
2----------------100-----------------ab2
3----------------100-----------------ab4
4----------------200-----------------ab1
5----------------200-----------------ab2
6----------------200-----------------ab3
7----------------300-----------------ab1
8----------------300-----------------ab2
9----------------300-----------------ab3
10---------------300-----------------ab4

现在,从这张表中我想过滤所有那些没有ab3或ab4的FK。当然,我期望不同的值,即在这种情况下结果将是FK = 100和200 我正在使用的查询是

select distinct(FK) 
from table1 
where column_entries != 'ab3' 
   or column_entries != 'ab4';

当然,此查询未获取所需结果。

3 个答案:

答案 0 :(得分:5)

尝试以下方法: -

select distinct fk_col from table1
minus
(select distinct fk_col from table1 where col_entry='ab3'
intersect
select distinct fk_col from table1 where col_entry='ab4')

这将显示所有没有'ab3'和'ab4'的FK。即你的情况下100和200

答案 1 :(得分:1)

如果我以正确的方式得到你的问题,下面的脚本可能是解决方案。

SELECT DISTINCT(TableForeignKey)
FROM Test
WHERE TableForeignKey NOT IN (
SELECT T1.TableForeignKey
FROM Test T1 INNER JOIN Test T2 ON T1.TableForeignKey = T2.TableForeignKey
WHERE T1.TableEntry = 'ab3' AND T2.TableEntry = 'ab4')

SQLFiddle Demo

答案 2 :(得分:0)

您可以在HAVING中使用带有条件聚合的GROUP BY:

SELECT FK
FROM table1
GROUP BY FK
HAVING COUNT(CASE column_entries WHEN 'ab3' THEN 1 END) = 0
    OR COUNT(CASE column_entries WHEN 'ab4' THEN 1 END) = 0
;

两个条件聚合分别计算'ab3''ab4'个条目。如果两者的结果都大于0,则相应的FK同时包含'ab3''ab4',因此不会返回。如果至少有一个计数评估为0,则认为FK满足要求。