2010-02-12 46 views
0

我需要一种方法可以从表中选择,如果该表不包含某种类型的数据。SQL Server - 选择不存在的数据

例如,如果我们有一个名为farm的表和另一个名为animal的表。现在FarmA包含一只猪和一只山羊,FarmB只包含一只山羊。我想选择所有不含猪的农场。

我第一次尝试是要做到这一点:
SELECT f.* FROM farm f INNER JOIN animal a ON f.Id = a.FarmId WHERE a.Name <> 'pig';
但是因为它包含了山羊,但我不希望它返回回有任何猪养殖场,这仍然返回我回来法尔马。

我试过一些subquerys,并使用not exists,但也没有工作。我相信这很容易,我只是不能构建我的查询权。

+0

在http://www.codinghorror.com/blog/archives/看看000976.html对不同类型的连接进行简单的视觉解释。 – adrianbanks 2010-02-12 19:59:51

+0

感谢您的链接/现在,我看到它使现在完成的查询/我欣赏它 – 2010-02-12 20:12:42

回答

5
select f.* 
from Farm f 
left outer join (
    select FarmID 
    from Animal 
    where Name = 'pig'  
) a on f.ID = a.FarmID 
where a.ID is null 
+0

我需要这个,但对于多列。每次尝试我都会得到比我应该指数更多的记录。这是绝对重要的,我没有不属于的记录。有任何想法吗?我需要在另一个表中不存在具有相同模式的行。他们在桌子前后。 – Chiramisu 2013-04-22 19:24:08

0

这是行不通的?我更熟悉Oracle,但我查了一下“NOT EXISTS”语法似乎是相同的:

SELECT f.* FROM FARM f WHERE NOT EXISTS 
    (SELECT * FROM animal a WHERE a.FarmId = f.FarmId and a.Name = 'pig')