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

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

这是类似但不准确的

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等处理应用程序层的代码生成.

本站公众号
   欢迎关注本站公众号,获取更多程序园信息
开发小院