当第二个字段为空时,在一个字段上进行SQL内部联接;当第一个字段为空时,在第二个字段上进行SQL内部联接

当第二个字段为空时,在一个字段上进行SQL内部联接;当第一个字段为空时,在第二个字段上进行SQL内部联接,sql,sql-server,sql-server-2008,join,inner-join,Sql,Sql Server,Sql Server 2008,Join,Inner Join,OP对于数据库和SQL来说是全新的,所以这个问题可能会在其他地方得到回答,但我没有足够的词汇来找到我想要的东西;朝着正确的方向推进会很好 我正在尝试查看两个表的内部连接。这就是他们目前的样子: 这就是我希望他们看起来的样子: 问题是视图是空的,因为c4和c5可以是空值 我基本上希望c4和c5上后面的两个内部连接发生,如果其中一个有值 我想说的是: 如果c4存在,则在其上进行内部联接 如果存在c5,则在其上进行内部连接 如果两者都不存在,则不要在其上进行内部连接 每一个前面都有UTC和colN

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

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

这就是我希望他们看起来的样子:

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

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

我想说的是:

  • 如果c4存在,则在其上进行内部联接
  • 如果存在c5,则在其上进行内部连接
  • 如果两者都不存在,则不要在其上进行内部连接
  • 每一个前面都有UTC和colNum之间的内部联接。我的意思是UTC和colNum连接总是发生的

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

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


    再说一次,我真的不知道SQL的语言,所以我在提出问题之前寻找答案的努力受到了阻碍。如果像这样的问题已经得到了回答,那就给我指一下。

    我认为在这里,UNION ALL查询是最好的选择

    SELECT field1, field2, field3 
    FROM table1 t1
    JOIN table2 t2 ON t2.field1 = t1.field1 AND t2.field2 = t2.field2
    UNION ALL
    SELECT field1, field2, field3 
    FROM table1 t1
    JOIN table2 t2 ON t2.field1 = t1.field1 AND t2.field3 = t2.field3
    

    在这种情况下,如果字段2为空,字段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)
    
    编辑:


    这是一个将始终在
    utc
    colnum
    上联接的版本,如果在两个表中都填写了c4和c5,也将在c4和c5上联接。

    合并(第1列,第2列,'')将起作用,但是,这并不便宜,因此如果您联接两个大表,最好采用不同的方法。

    我阅读了您的请求。联合查询是合适的解决方案。这方面的工作应该很好

    select  *
    
    from
        (
            select
                t1.primaryKey,
                t2.foreignKey
            from
                table1 t1 inner join 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
    

    On(t1.c4不为空,t2.c4不为空,t1.c4=t2.c4)或(t1.c5不为空,t2.c5不为空,t1.c5=t2.c5)
    @GiorgiNakeuri我将尝试使用它。在查询中它应该放在哪里?直接修改我的查询,我得到的结果好坏参半;我通常只使用用户界面。如果您有查询,请将其包含在您的问题中。@GordonLinoff我刚刚尝试过,但由于某些原因,我试图编辑我的帖子时出现了错误。我会继续trying@GordonLinoff我一直在尝试,但出于某种原因,它不允许我在代码块中编辑…奇怪。有时c4和c5都是空的。这包括那些吗?看起来不太一样,但我是一个完全的新手。不,当且仅当两个选项卡中的c4都相等或c5都相等时,这将连接两行。如果它们为null或列中的一个为null,则此语句将不会联接…如果两者都为null,则内部联接将阻止从任一表中显示字段。如果“3.如果两者都不存在,则不在其上进行内部联接。”意味着您仍然希望选择sizeconditionstable记录,则需要将其作为左外部联接。@JacobProffit的第三个数字表示UTC和colNum之间的前两个内部联接应创建该行。这两个连接取代了c4和c5之间的连接。抱歉搞混了,有点混乱。你能详细说明一下你什么时候想加入哪个专栏吗……我得调查一下。这会接受空值吗?这似乎是我问题的症结所在。我来看看coalesce。你为什么认为这可能是合适的?
    select  *
    
    from
        (
            select
                t1.primaryKey,
                t2.foreignKey
            from
                table1 t1 inner join 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