左外连接返回两个表

时间:2016-05-31 12:16:15

标签: sql sql-server left-join sql-server-2014-express

加入返回值,但在两个表中都找到了值。我的语法不好吗?

    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())解决,对吗?)和字段类型,还有哪些因素可能导致连接失灵?

1 个答案:

答案 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不返回任何值。