3

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

PK----------------FK-----------------列条目

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';

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

4

3 回答 3

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

于 2013-01-26T19:47:40.553 回答
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 演示

于 2013-01-26T20:35:37.143 回答
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认为满足要求。

于 2013-01-26T23:38:20.460 回答