SQL内部联接(如果未找到)忽略条件
SQL内部联接(如果未找到)忽略条件 假设我有一个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
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
)
)