当第二个为空时,SQL内连接在一个字段上,当第一个为空时,在第二个空时为

时间:2015-10-12 17:56:57

标签: sql sql-server sql-server-2008 join inner-join

OP对于数据库和SQL来说是全新的,所以这个问题可能会在其他地方得到解答,但我没有足够的词汇来找到我正在寻找的东西;向正确的方向推进会很棒。

我正在尝试查看内部连接的两个表。这是他们目前的样子: enter image description here

这就是我希望他们看的样子: enter image description here

这个问题是视图是空的,因为c4和c5可以是空值。

如果其中一个有值,我基本上希望c4和c5上的这两个后续内连接发生。

要彻底:

  1. 如果存在c4,则表示内连接。
  2. 如果c5存在,则内部连接就可以了。
  3. 如果两者都不存在,请不要内联。
  4. 每个都在UTC和colNum之间的内部联接之前。我的意思是UTC和colNum连接总是发生。

    我知道sql是一种查询语言,所以它不进行计算,但必须有一个过滤器,允许将这个逻辑应用于这两个表。

    值得注意的是,如果c4存在,则c5为null,如果c5存在,则c4为null,并且如果两者都为null,我仍然需要一行(基于前两个内连接连接)。

    同样,我真的不知道围绕SQL的语言,所以我在问一个问题之前找到答案的努力受到了阻碍。如果这样的事情已经得到解答,请指出我。

4 个答案:

答案 0 :(得分:3)

在评论中这是一个很大的声明,所以我会将其作为答案发布。如果我对问题的理解是正确的,那就像是:

select * 
from sizeconditionstable t1
join specalloytable t2
on (t1.c4 is not null and t2.c4 is not null and t1.c4 = t2.c4) or 
   (t1.c5 is not null and t2.c5 is not null and t1.c5 = t2.c5)

编辑:

select * 
    from sizeconditionstable t1
    join specalloytable t2
    on (t1.utc = t2.utc and t1.colnum = t2.colnum) and
       ((t1.c4 = t2.c4) or (t1.c4 is null and t2.c4 is null)) and
       ((t1.c5 = t2.c5) or (t1.c5 is null and t2.c5 is null))

这个版本将始终在utccolnum以及c4和c5上加入,如果它们在两个表格中填充的话。

答案 1 :(得分:1)

coalesce(column1,column2,'')会起作用,但是,它并不便宜,所以如果你加入两个大表,你最好采用不同的方法。

答案 2 :(得分:0)

我认为UNION ALL查询是您最好的选择。

UPDATE users SET column_name =column_name+10 WHERE id=4
Here 10 is the number by which i want to increase the value of colunm

在这种情况下,如果字段2为空且字段3不为,则第一个查询没有结果,但第二个查询带来结果

答案 3 :(得分:0)

我重新阅读了您的请求。联合查询是适当的解决方案。这些方面的东西应该运作良好。

选择*

这     (         选择             t1.primaryKey,             t2.foreignKey         从             table1 t1内连接table2 t2 on t1.c1 = t2.c1

    union

    select
        t1.primaryKey,
        t2.foreignKey
    from
        table1 t1 inner join table2 t2 on t1.c2 = t2.c2
) x inner join table1 t1 on x.primaryKey = t1.primaryKey
inner join table2 t2 on x.foreignKey