2012-08-08 44 views
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 

如何编写查询以获得示例中显示的Expected out?

只是让你知道表是100plus K行大,如果有帮助。

最后,为什么上面的代码不起作用有些灯会是有益的。我看着这个this link似乎是外连接必须工作,可能是我根本无法理解这一点。我也试过full outer join,没有帮助。使用except我只能找到artno,但没有让我生成name列。

回答

1

另一种方法可能是

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

大表上,第二种方法最有可能是更好的。

+0

@tuncay,谢谢。第二个选项有帮助,但不是第一个,我无法解释为什么,但如果你这样做会有帮助。 – tough 2012-08-08 12:06:52

+0

请您告诉我后面的's.artno'和's.artno'的位置是否与'join'语句的'left'和'right'有关。 – tough 2012-08-08 14:01:21

+0

我真的不这么认为。它是一个条件,我指定了明确的表别名(“a”和“s”)。 – 2012-08-08 14:05:05

0
select art.artno, art.name from art 
where art.artno not in (select store.artno from store) 

你不需要做任何形式的加入使用的内部查询(在(select store.artno from store)在这种情况下)的。内部查询就像构建一个临时表,填充值并在查询中使用它。

既然你想让你的内部查询给你所有artno在表store,你应该使用(select store.artno from store)而不是(select art.artno from store),因为我认为这将选择从外部查询art.artno,没有考虑到store的内容表。

+0

这似乎不工作我也试过了。但不知道为什么?似乎必须加入才能得到这样的结果。 – tough 2012-08-08 11:50:10

+0

这适用于sqlite3。我无法使用MSSQL进行测试,因为我没有它,对不起。 – 2012-08-08 11:56:28

0

乔治答案的作品,但在这种大小的表格与'不存在'相关子查询会更快。

经过测试,我的子查询比左边的要慢。这是前进的方式

+0

@Tuncay和Gene:是的,但是这取决于所做的工作。优化器。例如,如果你在store.artno上有一个索引,而在art.artno上有另一个索引,那么我认为sqlite引擎的行为与内部查询一样快,就像你已经建立了连接一样。 – 2012-08-08 11:51:49

+0

随着表格变大,与连接相比,子查询总是会变得更慢。我通常尽量避免子查询。 MySQL版本<4的教训。 – 2012-08-08 12:01:55

+0

@gene,谢谢,这将需要大量的查询时间,所以我试了一下,花了超过一分钟,并停止了它。对不起,我不得不编辑我最初提出的匹配给定示例的查询。 – tough 2012-08-08 12:09:22

相关问题