2

所以我有一个有 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

4 回答 4

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
于 2012-10-02T13:49:36.767 回答
2

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

SELECT * 
FROM Komponens
WHERE kkod NOT IN (
    SELECT kkod
    FROM Komponens
    WHERE fkod = "SU"
)
于 2012-10-02T13:49:49.050 回答
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")

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

祝你好运

于 2012-10-02T14:14:25.283 回答
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.

于 2012-10-02T14:14:31.297 回答