加入返回值,但在两个表中都找到了值。我的语法不好吗?
select distinct source.[Manufacturer]
from Products2.dbo.sourceexport source
left join Products2.dbo.uniqueprods u
on source.[Manufacturer]=u.mfg
where u.mfg is null;
select [Manufacturer] from Products2.dbo.sourceexport where [Manufacturer]='XYZ';
select mfg from Products2.dbo.uniqueprods where mfg='XYZ'
select / join语句返回大约20行,第一行是'XYZ',但对于某些行,它也可以是'XYZ'格式。当我将结果(带/不带填充,在我的所有字段上都有/ ltrim(rtrim(u.mfg))
)复制到第二个和第三个where语句时,我分别得到15和260个结果。
左外连接的任何结果都应为右表返回0行,而260则超过我期望的0。
编辑:我在之前的问题中被告知我太啰嗦了。显然在这里,我不够冗长。谢谢。
我想要一个左外连接。这意味着,我希望source
中的制造商不在u
中。我们可以返回所有行的所有字段,如果这有助于您更好地回答问题,那么我可以创建第二步,从这些结果中选择不同的制造商。
我有几百万条记录,其中包含我的客户认为敏感的信息。提及这些小部件制造商的行业是不合适的。除了我的客户之外,任何人都不会特别感兴趣。
我的表source
包含值(a,b,c,d,f,h,j,l)和表u
的值(a,c,e,g,g) ,I,K,L)。我想返回值(b,d,f,h,j)。我得到的返回值包含但不包含c。我不知道它是否包含所有(b,d,f,h,j),因为我不相信我的陈述有效。
以不同方式陈述问题:如何编写左外连接,其中语句的结果都不在右表中?
Edit2:从下面的陈述中看来,语法并不错。使我的第一个编辑问题重述无效。回到原始问题陈述,为什么我的左外连接返回两个表中找到的值?
除了不可见的字符(应该由ltrim(rtim())解决,对吗?)和字段类型,还有哪些因素可能导致连接失灵?
答案 0 :(得分:1)
我怀疑你的第二和第三个sql语句不是你认为的,你需要使用In子句包装初始查询。 将@ t1声明为表(制造商varchar(1)) 将@ t2声明为表(mfg varchar(1))
insert into @t1 values ('a'),('b'),('c'),('d'),('f'),('h'),('j'),('l')
insert into @t2 values ('a'),('c'),('c'),('g'),('g'),('i'),('k'),('l')
/*query 1*/
select *
from @t1
where manufacturer in(
select distinct source.[Manufacturer]
from @t1 source
left join @t2 u
on source.[Manufacturer]=u.mfg
where u.mfg is null
)
/*Query 2*/
select *
from @t2
where mfg in(
select distinct source.[Manufacturer]
from @t1 source
left join @t2 u
on source.[Manufacturer]=u.mfg
where u.mfg is null
)
查询1现在返回@ t1中的所有值,而查询2不返回任何值。