SQL内部联接(如果未找到)忽略条件

SQL内部联接(如果未找到)忽略条件,sql,sql-server,join,Sql,Sql Server,Join,SQL内部联接(如果未找到)忽略条件 假设我有一个SQL查询,如: SELECT A.* FROM Table_A A INNER JOIN Table_B B ON A.Field1 = B.Field1 AND A.Field2 = B.Field2 WHERE A.Field3 > 10 我想实现的是,我们首先通过Field1/Field2进行内部联接,如果没有找到数据,则只通过Field1进行联接 正确的方法是什么 表A: Id Field1 Field2 Field3 1 a

SQL内部联接(如果未找到)忽略条件

假设我有一个SQL查询,如:

SELECT A.* FROM Table_A A
INNER JOIN Table_B B ON A.Field1 = B.Field1 AND A.Field2 = B.Field2
WHERE A.Field3 > 10
我想实现的是,我们首先通过
Field1
/
Field2
进行内部联接,如果没有找到数据,则只通过Field1进行联接

正确的方法是什么

表A:

Id Field1 Field2 Field3
1  a      b      12
2  a      c      13
3  e      f      14
2  d      c      15
表B:

Id Field1 Field2
1  a      b      
2  e      g
结果应该是:

Id Field1 Field2 Field3
1  a      b      12
3  e      f      14 

联盟的第一部分是你的原创。如果两组字段都不匹配,则第二部分仅在第一组字段上联接

SELECT * FROM Table_A A
INNER JOIN Table_B B ON A.Field1 = B.Field1 AND A.Field2 = B.Field2
WHERE A.Field3 > 10

UNION

SELECT * FROM Table_A A
INNER JOIN Table_B B ON A.Field1 = B.Field1
WHERE A.Field3 > 10
  AND NOT EXISTS
     (SELECT 1 FROM TABLE_B B2
       WHERE A.Field1 = B2.Field1 AND A.Field2 = B2.Field2);

您可以在同一个表上进行两次联接,一次使用内部联接,另一次使用左联接,并将条件逻辑放在左联接上

select distinct t1.*
from table1 t1
left join table2 t2 on t1.f2 = t2.f2
inner join table2 t3 on t1.f1 = t3.f1
输出

Id  Field1  Field2  Field3
---------------------------
1    a       b       12
3    e       f       14

您可以在内部联接中使用CASE。请检查以下内容:

declare @a table (col1 int, col2 int, col3 int)
declare @b table (col1 int, col2 int, col3 int)

Insert into @a values(1,1,11),(2,2,15),(3,4,20),(4,5,9)
Insert into @b values(1,1,5),(2,2,2),(3,3,20),(4,5,20)


select A.* from @a A inner join @b B on 
(CASE 
 WHEN  A.col2 = B.col2 then 1
 WHEN  A.col2 <> B.col2 then 1
 ELSE 1
END) = 1 and A.col1 = B.col1
where A.col3 > 10
declare@a表(col1 int、col2 int、col3 int)
声明@b表(col1 int,col2 int,col3 int)
插入@a值(1,1,11)、(2,2,15)、(3,4,20)、(4,5,9)
插入@b值(1,1,5)、(2,2,2)、(3,3,20)、(4,5,20)
从上的@A A内部联接@b中选择一个*
(案例
当A.col2=B.col2时,则为1
当A.col2 B.col2然后1
其他1
结束)=1,A.col1=B.col1
其中A.col3>10

您可以尝试以下查询:

SELECT ta.*
FROM @Table_A ta 
INNER JOIN @Table_B tb ON ta.Field1 = tb.Field1
WHERE ta.Field3 > 10
AND 
(
   ta.Field2 = tb.Field2
   OR
   NOT EXISTS (
                SELECT 1 FROM @Table_A ta2
                INNER JOIN @Table_B tb2 ON ta2.Field1 = tb2.Field1 AND ta2.Field2 = tb2.Field2
                WHERE ta2.Field1 = ta.Field1
            )    
)

演示链接:

我们首先通过Field1/Field2进行内部连接,如果没有找到数据,则仅通过Field1进行连接。??你能详细解释一下吗?当然。如果通过
Field1
Field2
连接A和B,我们找到了一个数据,那么就可以了。但有时可能无法同时满足这两个条件。在这种情况下,我们只想再次使用
Field1
condition.1st与A.Field1=B.Field1和A.Field2=B.Field2上的condition内部联接表_B联接,如果没有数据返回由A.Field1=B.Field1上的condition内部联接表_B联接的联接,我会尝试联合。请参阅下文。出现问题的原因可能是表格设计不理想。您是否考虑过将表B更改为一列,其中包含字段1和字段2中的所有值,另一列名为type,其中包含值为“1”或“2”的列?请尝试使用
插入@a值(1,1,11)、(2,2,15)、(3,3,19)、(3,4,20)、(4,5,9)
等数据准备表@a。我想要达到的是第一个有两个条件,如果只有一个条件失败。您的代码似乎对我来说不需要第二个条件。@JerryBian:是的,它和您期望的一样。如果第二个条件失败,我将在我的案例条件中返回1,该条件仍将按照您的预期返回结果您的意思是
否则0
?如果我将代码“WHEN A.col2 B.col2 then 1”更改为“WHEN A.col2 B.col2 then 0”然后结果将仅是col1和col2都匹配的记录。您的解决方案完全依赖于
Id
SELECT ta.*
FROM @Table_A ta 
INNER JOIN @Table_B tb ON ta.Field1 = tb.Field1
WHERE ta.Field3 > 10
AND 
(
   ta.Field2 = tb.Field2
   OR
   NOT EXISTS (
                SELECT 1 FROM @Table_A ta2
                INNER JOIN @Table_B tb2 ON ta2.Field1 = tb2.Field1 AND ta2.Field2 = tb2.Field2
                WHERE ta2.Field1 = ta.Field1
            )    
)