2013-03-08 32 views
1

使用简单的表/字段名称为简单起见:SQL Server查询,不能使用子查询

SELECT A.a 
FROM A LEFT JOIN B ON A.a = B.a 
WHERE B.a IS NULL 
AND B.a NOT IN (
    SELECT B.a FROM B WHERE B.b = 'literal' 
) 

它应该从表A返回行,其中a字段不表B中存在B.b等于特定值(将作为参数传递)的那些行。

A.a 
------- 
1 
2 
3 

B.a  B.b 
----- ----- 
1  'literal' 
1  'abc' 
2  'def' 

考虑到数据,查询应该返回:

A.a 
------ 
2 
3 

回答

2

我希望我理解你正在努力实现正确的。

SELECT A.a 
FROM A 
LEFT JOIN B 
    ON A.a = B.a 
    AND B.b = 'literal' 
WHERE B.a IS NULL 

SQL Fiddle

SQL Fiddle具有相同的数据@Ozzyberto

+0

我真的不知道我可以从你的答案会发生什么结果,我尝试了,我得到0行返回。我添加了一个例子,希望它有助于澄清所需的结果。 – Ozzyberto 2013-03-08 01:13:34

+0

哦,我没有注意到这个链接,我查了一下,看起来是对的。我的执行过程中一定有什么问题。我会做更多的测试。 – Ozzyberto 2013-03-08 01:14:32

+0

@Ozzyberto请考虑接受答案,如果它帮助你。 – 2013-03-08 06:40:21

0
create table A (a int) 

insert into A 
select 1 
union all 
select 2 
union all 
select 3 

create table B (a int, b varchar(10)) 

insert into B 
select 1, 'literal' 
union all 
select 2, 'abc' 
union all 
select 3, 'def' 

select A.a 
from A 
LEFT JOIN B 
on A.a = B.a 
where B.b <> 'literal' or B.b is null