sql-server - 根据条件确定要连接的表

标签 sql-server stored-procedures

我不确定我是否错过了正确的搜索,但我无法得到与我一样的确切问题

这有点相似,但不完全相同

https://stackoverflow.com/questions/11533636/determining-which-table-to-join-to

实际上我想根据传递给存储过程的参数来决定加入哪个表,情况不起作用

有点

select * from Table1 
       left join (case when @Parameter<>NULL Then Table2 else Table3 end) final
       on Table1.Col1 = final.Col1

表2和表3具有相同的结构

最佳答案

我可以想到一些选择:

1:IF ... ELSE

IF @Parameter IS NULL

  SELECT *
  FROM T1
    INNER JOIN T2 ON T1.ID = T2.ID

ELSE

  SELECT *
  FROM T1
    INNER JOIN T3 ON T1.ID = T3.ID

2:动态T-SQL

DECLARE @SQL NVARCHAR(MAX);

SELECT @SQL = N'SELECT *
  FROM T1
    INNER JOIN ' + CASE WHEN @Parameter IS NULL THEN N'T2 t' ELSE N'T3 t' END
  + N' ON T1.ID = t.ID';

EXEC sp_executesql @SQL;

3:UNION ALL 和子查询。

  SELECT *
  FROM T1
    INNER JOIN
    (
      SELECT *
      FROM T2
      WHERE @Parameter IS NULL
      UNION ALL
      SELECT *
      FROM T3
      WHERE @Parameter IS NOT NULL
    ) t ON T1.ID = t.ID

对于最后一个,您必须检查优化器创建的计划,看看其性能是否良好。

您似乎正在寻求代码重用,所以也许选项 2 是您最好的选择。 T-SQL 并不真正适合这种多态性,但在某些情况下您可以使用变通方法。

退一步,要问的一个问题是,如果表具有相同的结构,也许您应该只使用一个表?然后,您可以使用 @Parameter 来过滤您需要的行,而不是尝试创建动态查询。

还值得注意的是,在这种情况下,您可以使用 ORM 等在应用程序层处理代码生成。

关于sql-server - 根据条件确定要连接的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15989593/

相关文章:

mysql - 使用存储过程性能会提高

sql-server - SQL Server 2019 中标量 UDF 内联的问题

mysql - 复制 Sql 条目并添加时间引用

SQL Server - 异步查询执行

oracle - PL/SQL : For loop for select over a list

mysql - 当函数返回嵌套表时在选择查询中调用 PLSQL 函数时出现问题

MySQL Cursor Loop 不更新

sql-server - SQL Server : multiple INSERT with MERGE

.net - 针对 SQL Server 2008 运行时 SqlDataReader.HasRows 是否存在错误?

sql - 单个字段是否包含来自不同表的多个外键关系[SQL]