首页 > 解决方案 > 加入表级数据条件

问题描述

我有 2 个表,当我加入那些我需要匹配表 2 中可用条件的记录时

在此处输入图像描述

对于记录 empid:106 查询应如下所示

select A.* from tbl1 A join tbl2 B on a.empid=b.empid and condition 1 and condition 2

需要动态考虑条件。

标签: sqlsql-server

解决方案


给定您的示例,这是一种可以构建和执行动态语句的方法。这不是最终结果,有一些条件没有处理(例如,如果 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 |
+--------+------+------+------+

推荐阅读