0
select art.artno, art.name  from Art 
left outer join store on art.artno =store.artno  
where art.Artno not in (select art.artno from store)

查询应该是这样的,但似乎不起作用(我在列名旁边没有得到任何结果行)。使用 MSSQL 2008。

table art             table store                 EXPECTED RESULT 
artno   name          artno qty                  artno   name 
    1    xbox360          1   1                      2     XHW
    2    XHW              3   2                      5     PS2
    3    NETANDO          4   1
    5    PS2              6   3
    6    PS1 
    4    X1

如何编写查询以获取示例中显示的预期结果?

只是为了让您知道如果有帮助,这些表有 100 多 K 行。

最后,关于上述代码为什么不起作用的一些说明将是有益的。我看了this这个链接似乎outer join must work,可能我根本无法理解。

我也试过了full outer join,没有帮助。使用except我只能找到artno但没有让我生成该name列。

4

3 回答 3

1

另一种方法可能是

select
  a.`artno`,
  a.`name`
from
  art a
left join
  store s on s.artno=a.artno
where
  s.artno is null

在大表上,第二种方法很可能会更好。

于 2012-08-08T11:43:03.693 回答
0

Georges 的回答有效,但在这种大小的表上,带有“不存在”的相关子查询会更快。

经过测试,我的子查询比左外部慢。这是前进的方向

于 2012-08-08T11:44:50.120 回答
0
select art.artno, art.name from art
where art.artno not in (select store.artno from store)

您不需要执行任何类型的连接来使用内部查询((select store.artno from store)在这种情况下)。内部查询就像构建一个临时表,用值填充它,然后在查询中使用它。

由于您希望您的内部查询为您提供artnotable 中的所有内容,因此store您应该使用(select store.artno from store)and not (select art.artno from store),因为我认为这会art.artno从外部查询中选择,而不考虑store表格的内容。

于 2012-08-08T11:42:53.740 回答