join - 根据通过字符串传递的列名创建动态 SQL
问题描述
我需要找出表 A 中存在并且表 B 中缺少的行(使用 LEFT JOIN),其中表 A 和表 B 是两个具有相同结构但在不同模式中的表。但是查询必须使用动态 SQL 构建,并且需要用于执行 JOIN 的列存储在字符串中。如何从字符串中提取列名并使用它们动态构造以下查询:
数据库是 Azure SQL Server
例如:
DECLARE @ColNames NVARCHAR(150) = 'col1,col2'
根据 ColNames 中定义的列构建查询:-
SELECT *
FROM Table A
Left Join
Table B
ON A.col1 = B.col1
AND A.col2 = B.col2
AND B.col1 IS NULL AND B.col2 IS NULL
如果列数@ColNames
更多,则 SELECT 语句需要满足所有列。
解决方案
在不知道完整上下文的情况下,试试这个:
DECLARE @ColNames NVARCHAR(150) = 'col1,col2'
DECLARE @JoinContion NVARCHAR(MAX) = ''
DECLARE @WhereCondition NVARCHAR(MAX) = ''
SELECT @JoinContion += CONCAT('[a].', QUOTENAME(Value), ' = ', '[b].', QUOTENAME(Value), (CASE WHEN LEAD(Value) OVER(ORDER BY Value) IS NOT NULL THEN ' AND ' ELSE '' END))
,@WhereCondition += CONCAT('[a].', QUOTENAME(Value), ' IS NULL', (CASE WHEN LEAD(Value) OVER(ORDER BY Value) IS NOT NULL THEN ' AND ' ELSE '' END))
FROM STRING_SPLIT(@ColNames,N',')
SELECT @JoinContion, @WhereCondition
- String_Split:将输入字符串拆分为列
- Lead
AND
:当关键字不是最后一行时,确定我们是否需要关键字。
请注意,这NOT EXISTS
可能是一个更好的解决方案LEFT JOIN
推荐阅读
- sql - 根据商店选择每个产品的最新余额(SQL)
- python - 将一种 json 格式更改为另一种
- excel - 如何从动态添加的文本框中读取文本?
- jquery - 如何使用 jquery 从 api 调用加载新图表(chartsjs)?
- c# - 使用月份名称动态绑定下拉列表
- c# - 错误:非静态字段、方法或属性需要对象引用(在 Unity 中)
- html - 改变标签的颜色通过内部 CSS
- python - 我似乎在这里找不到导致此故障的错误
- react-native - 当用户进入该屏幕时,如何自动重新加载或刷新整个屏幕。在本机反应
- python - 从熊猫数据框列中的列表中删除第一个和最后一个值