sql - 加入表级数据条件
问题描述
我有 2 个表,当我加入那些我需要匹配表 2 中可用条件的记录时
对于记录 empid:106 查询应如下所示
select A.* from tbl1 A join tbl2 B on a.empid=b.empid and condition 1 and condition 2
需要动态考虑条件。
解决方案
给定您的示例,这是一种可以构建和执行动态语句的方法。这不是最终结果,有一些条件没有处理(例如,如果 TBL2 中不存在员工的行怎么办?)。
/* CREATE MOCK-UP TABLES/DATA */
CREATE TABLE TBL1 ( [emp_id] int, [name] varchar(3), [sal] int, [dept] int );
CREATE TABLE TBL2 ( [empid] int, [fclo] varchar(4), [cond] varchar(10), [operator] varchar(3) );
INSERT INTO TBL1 ( [emp_id], [name], [sal], [dept] ) VALUES
( 101, 'AAA', 2000, 10 ),
( 102, 'BBB', 5000, 20 ),
( 103, 'CCC', 9000, 10 ),
( 104, 'DDD', 6010, 20 ),
( 105, 'EEE', 4000, 10 ),
( 106, 'FFF', 7000, 20 ),
( 107, 'GGG', 8000, 30 ),
( 105, 'EEE', 4000, 20 );
INSERT INTO TBL2 ( [empid], [fclo], [cond], [operator] ) VALUES
( 105, 'dept', '<>10', 'AND' ),
( 106, 'sal', '>2000', 'AND' ),
( 106, 'dept', '<>10', 'AND' );
基于特定员工构建并执行动态语句。
DECLARE @emp int = 106;
-- Initialize the dynamic statement --
DECLARE @sql varchar(MAX) = '[emp_id]=' + CAST ( @emp AS VARCHAR(10) );
-- Build WHERE clause --
SELECT
@sql = ISNULL ( @sql, '' ) + ' ' + operator + ' ' + '[' + fclo + ']' + ' ' + cond
FROM TBL1 AS A
INNER JOIN TBL2 AS B
ON A.emp_id = B.empid
WHERE
A.emp_id = @emp;
-- Complete @T_SQL statement --
SET @sql = 'SELECT * FROM TBL1 WHERE ' + @sql + ';';
/* PRINT out completed dynamic statement */
PRINT @sql;
/* Execute the dynamic statement */
EXEC ( @sql );
PRINT
该语句揭示了底层的动态 SQL:
SELECT * FROM TBL1 WHERE [emp_id]=106 AND [sal] >2000 AND [dept] <>10;
EXEC
动态 SQL的执行返回:
+--------+------+------+------+
| emp_id | name | sal | dept |
+--------+------+------+------+
| 106 | FFF | 7000 | 20 |
+--------+------+------+------+
推荐阅读
- python - 如何在注释中包含变量?
- ios - 在点击时扩展 UICollectionViewCell
- bash - bash for 循环中的两个不同文件引用同时
- python - 如何将值更改为日期格式以及如何将值更改为时间格式
- reactjs - TS2604:将“material-ui”按钮从一个包导入到另一个包时
- ruby-on-rails - 为什么 rake 中缺少 DB 任务?
- django - 当 GenericRelation 字段在序列化程序中标记为不需要时,“此字段是必需的”
- python - 如何使用带有下拉菜单的 selenium 抓取历史数据?
- json - kotlin.kotlin空指针异常
- javascript - 如何拆分 querySelectorAll 结果?