使用SQL排除记录

时间:2012-10-02 13:48:16

标签: sql ms-access

所以我有一张包含10条记录的表格。

SELECT * FROM Komponens WHERE fkod = "SO"

它给了我一张约5条记录的表格。但我希望没有那5条记录的结果。

例如:

fkod   kkod
SU     AA
SU     AC
SA     AB
CI     AC
CI     AA

fkod 是香料的名称(SU - 糖,SA - 盐,CI - 肉桂), kkod 是香料混合物的名称。我没糖了,我想展示我可以创造的混合物,因为它们不需要糖(在这种情况下只是SA - AB

如果我使用SELECT * FROM Komponens WHERE fkod != "SU",我会获得AB,AC和AA。

如何在SQL中解决它?

4 个答案:

答案 0 :(得分:4)

SELECT * FROM Komponens WHERE (fkod <>"SO") or (fkod is null)

给出补充说明,acatt的答案是正确的,用fkod = SU识别kkod,然后识别kkod在该集合之外的行。

我能想到编写SQL的唯一方法是:

SELECT k.* 
FROM Komponens k left outer join
(select kkod from Komponens WHERE fkod = "SU" group by kkod) l
on k.kkod   = l.kkod   
where l.kkod is null

答案 1 :(得分:2)

修改使用新逻辑。请试试这个:

SELECT * 
FROM Komponens
WHERE kkod NOT IN (
    SELECT kkod
    FROM Komponens
    WHERE fkod = "SU"
)

答案 2 :(得分:1)

我不确定这是否适用于Access但

SELECT * FROM Komponens WHERE fkod = "SU"
SELECT * FROM Komponens WHERE fkod != "SU"

给你那些含糖和没有糖的人,所以......

SELECT * FROM Komponens WHERE fkod != "SU" 
AND kkod NOT IN (SELECT * FROM Komponens WHERE fkod = "SU")

我没有测试它,但它应该让你走上正确的路线。

祝你好运

答案 3 :(得分:1)

你有一张表每个混合物包含一个记录吗?您的数据库似乎遗漏了这一点。尽管如此,您仍然可以解决您的问题:

 SELECT * FROM Komponens K1 WHERE NOT EXISTS 
    (SELECT * FROM Komponens K2 WHERE K2.kkod = K1.kkod AND K2.fkod = 'SA')

 SELECT * FROM Komponens K1 WHERE kkod NOT IN 
     (SELECT kkod FROM Komponens WHERE fkod = 'SA')

这些将为您提供混合物和所有香料成分,您可以制作不含糖的混合物。如果您只想要混合物列表,而不是每种混合物都有多行,请将SELECT *更改为SELECT DISTINCT kkod