sql-server - 内连接条件:当第一个表中的值为“ALL”时,它与第二个表中的所有值连接?
问题描述
我需要在多个值上加入 2 个表。
当第一个表中的值为“ALL”时,它应该连接第二个表中的所有值。如果是任何其他值,它应该正常加入。
我需要加入 5 个不同的列,其中 4 个可能具有值“ALL”(Column1、Column2、Column3 和 Column4),因此我编写了以下由 16 个部分查询组成的查询。
它有效,但我认为必须有更好的方法来做到这一点。我该如何优化它?
SELECT *
FROM [Temporaer-Prozessplan-Resultat] AS PP
INNER JOIN [Mapping-Lean-Vergaben] AS MV ON PP.Column5 = MV.Column5
AND PP.Column1 = MV.Column1
WHERE MV.Column1 != 'ALL'
AND MV.Column2 = 'ALL'
AND MV.Column3 = 'ALL'
AND MV.Column4 = 'ALL'
UNION ALL
SELECT *
FROM [Temporaer-Prozessplan-Resultat] AS PP
INNER JOIN [Mapping-Lean-Vergaben] AS MV ON PP.Column5 = MV.Column5
AND PP.Column2 = MV.Column2
WHERE MV.Column1 = 'ALL'
AND MV.Column2 != 'ALL'
AND MV.Column3 = 'ALL'
AND MV.Column4 = 'ALL'
UNION ALL
SELECT *
FROM [Temporaer-Prozessplan-Resultat] AS PP
INNER JOIN [Mapping-Lean-Vergaben] AS MV ON PP.Column5 = MV.Column5
AND PP.Column3 = MV.Column3
WHERE MV.Column1 = 'ALL'
AND MV.Column2 = 'ALL'
AND MV.Column3 != 'ALL'
AND MV.Column4 = 'ALL'
UNION ALL
SELECT *
FROM [Temporaer-Prozessplan-Resultat] AS PP
INNER JOIN [Mapping-Lean-Vergaben] AS MV ON PP.Column5 = MV.Column5
AND PP.Column4 = MV.Column4
WHERE MV.Column1 = 'ALL'
AND MV.Column2 = 'ALL'
AND MV.Column3 = 'ALL'
AND MV.Column4 != 'ALL'
UNION ALL
SELECT *
FROM [Temporaer-Prozessplan-Resultat] AS PP
INNER JOIN [Mapping-Lean-Vergaben] AS MV ON PP.Column5 = MV.Column5
AND PP.Column1 = MV.Column1
AND PP.Column2 = MV.Column2
WHERE MV.Column1 != 'ALL'
AND MV.Column2 != 'ALL'
AND MV.Column3 = 'ALL'
AND MV.Column4 = 'ALL'
UNION ALL
SELECT *
FROM [Temporaer-Prozessplan-Resultat] AS PP
INNER JOIN [Mapping-Lean-Vergaben] AS MV ON PP.Column5 = MV.Column5
AND PP.Column1 = MV.Column1
AND PP.Column4 = MV.Column4
WHERE MV.Column1 != 'ALL'
AND MV.Column2 = 'ALL'
AND MV.Column3 = 'ALL'
AND MV.Column4 != 'ALL'
UNION ALL
SELECT *
FROM [Temporaer-Prozessplan-Resultat] AS PP
INNER JOIN [Mapping-Lean-Vergaben] AS MV ON PP.Column5 = MV.Column5
AND PP.Column2 = MV.Column2
AND PP.Column3 = MV.Column3
WHERE MV.Column1 = 'ALL'
AND MV.Column2 != 'ALL'
AND MV.Column3 != 'ALL'
AND MV.Column4 = 'ALL'
UNION ALL
SELECT *
FROM [Temporaer-Prozessplan-Resultat] AS PP
INNER JOIN [Mapping-Lean-Vergaben] AS MV ON PP.Column5 = MV.Column5
AND PP.Column3 = MV.Column3
AND PP.Column4 = MV.Column4
WHERE MV.Column1 = 'ALL'
AND MV.Column2 = 'ALL'
AND MV.Column3 != 'ALL'
AND MV.Column4 != 'ALL'
UNION ALL
SELECT *
FROM [Temporaer-Prozessplan-Resultat] AS PP
INNER JOIN [Mapping-Lean-Vergaben] AS MV ON PP.Column5 = MV.Column5
AND PP.Column1 = MV.Column1
AND PP.Column3 = MV.Column3
WHERE MV.Column1 != 'ALL'
AND MV.Column2 = 'ALL'
AND MV.Column3 != 'ALL'
AND MV.Column4 = 'ALL'
UNION ALL
SELECT *
FROM [Temporaer-Prozessplan-Resultat] AS PP
INNER JOIN [Mapping-Lean-Vergaben] AS MV ON PP.Column5 = MV.Column5
AND PP.Column2 = MV.Column2
AND PP.Column4 = MV.Column4
WHERE MV.Column1 = 'ALL'
AND MV.Column2 != 'ALL'
AND MV.Column3 = 'ALL'
AND MV.Column4 != 'ALL'
UNION ALL
SELECT *
FROM [Temporaer-Prozessplan-Resultat] AS PP
INNER JOIN [Mapping-Lean-Vergaben] AS MV ON PP.Column5 = MV.Column5
AND PP.Column1 = MV.Column1
AND PP.Column2 = MV.Column2
AND PP.Column4 = MV.Column4
WHERE MV.Column1 != 'ALL'
AND MV.Column2 != 'ALL'
AND MV.Column3 = 'ALL'
AND MV.Column4 != 'ALL'
UNION ALL
SELECT *
FROM [Temporaer-Prozessplan-Resultat] AS PP
INNER JOIN [Mapping-Lean-Vergaben] AS MV ON PP.Column5 = MV.Column5
AND PP.Column1 = MV.Column1
AND PP.Column2 = MV.Column2
AND PP.Column3 = MV.Column3
WHERE MV.Column1 != 'ALL'
AND MV.Column2 != 'ALL'
AND MV.Column3 != 'ALL'
AND MV.Column4 = 'ALL'
UNION ALL
SELECT *
FROM [Temporaer-Prozessplan-Resultat] AS PP
INNER JOIN [Mapping-Lean-Vergaben] AS MV ON PP.Column5 = MV.Column5
AND PP.Column1 = MV.Column1
AND PP.Column3 = MV.Column3
AND PP.Column4 = MV.Column4
WHERE MV.Column1 != 'ALL'
AND MV.Column2 = 'ALL'
AND MV.Column3 != 'ALL'
AND MV.Column4 != 'ALL'
UNION ALL
SELECT *
FROM [Temporaer-Prozessplan-Resultat] AS PP
INNER JOIN [Mapping-Lean-Vergaben] AS MV ON PP.Column5 = MV.Column5
AND PP.Column2 = MV.Column2
AND PP.Column3 = MV.Column3
AND PP.Column4 = MV.Column4
WHERE MV.Column1 = 'ALL'
AND MV.Column2 != 'ALL'
AND MV.Column3 != 'ALL'
AND MV.Column4 != 'ALL'
UNION ALL
SELECT *
FROM [Temporaer-Prozessplan-Resultat] AS PP
INNER JOIN [Mapping-Lean-Vergaben] AS MV ON PP.Column5 = MV.Column5
AND PP.Column1 = MV.Column1
AND PP.Column2 = MV.Column2
AND PP.Column3 = MV.Column3
AND PP.Column4 = MV.Column4
WHERE MV.Column1 != 'ALL'
AND MV.Column2 != 'ALL'
AND MV.Column3 != 'ALL'
AND MV.Column4 != 'ALL'
UNION ALL
SELECT *
FROM [Temporaer-Prozessplan-Resultat] AS PP
INNER JOIN [Mapping-Lean-Vergaben] AS MV ON PP.Column5 = MV.Column5
WHERE MV.Column1 = 'ALL'
AND MV.Column2 = 'ALL'
AND MV.Column3 = 'ALL'
AND MV.Column4 = 'ALL';
解决方案
我应用了 Mahesh 的建议,最终查询如下所示:
select * from [Temporaer-Prozessplan-Resultat] as PP
inner join
[Mapping-Lean-Vergaben] as MV
on
PP.column5=MV.column5
where 1= case when MV.column1 ='ALL' then 1
when PP.column1=MV.column1 then 1
else 0
end
and
2= case when MV.column2 ='ALL' then 2
when PP.column2 =MV.column2 then 2
else 0
end
and
3= case when MV.column3 ='ALL' then 3
when PP.column3 =MV.column3 then 3
else 0
end
and
4= case when MV.column4 ='ALL' then 4
when PP.column4=MV.column4 then 4
else 0
end
推荐阅读
- docker - 如何停止 HAProxy 将我的 POST 转换为 GET
- nasm - 无法在 sasm 中打开包含文件“test.inc”
- swiftui - SwiftUI(homekit)addAndSetupAccessories - 如何区分弹出关闭与设备添加成功
- sql - SQL 帮助 - 检测指定值列表中的更改
- angular - 用原理图生成多个文件?
- f# - 如何使用 F# 解决 VS 2019 中未处理的错误
- flutter - Flutter - textField 在值更改时不会滚动到插入符号位置
- api - 如何使用使用自签名 SSL 的 API?
- android - 如何在 android volley 中添加用于授权的 API 密钥作为标头?
- c++ - 模板类型擦除