根据条件确定要连接的表

2024-04-28

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

这是类似但不准确的东西

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

实际上我想根据传递给存储过程的参数来决定加入哪个表,case when没用

Kind of

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

根据条件确定要连接的表 的相关文章

随机推荐

  • Azure DevOps API 版本定义

    尝试从其他项目复制发布模板时出现以下错误 VS402982 未为 PROJECT ENV 阶段设置保留策略 发布管道级别的保留策略已弃用 id 8 name PROJECT ENV rank 1 owner displayName Zoe
  • 根据一列删除重复项并保留最后一个条目

    我正在尝试根据一列删除重复项并保留最后一个条目 现在我的公式保持第一个值 我正在使用这篇文章中找到的公式 选择具有不同列值的所有行 Google 查询语言 https stackoverflow com questions 30318460
  • 关闭 MAMP 中的缓存

    尝试关闭 MAMP 中的缓存进行开发 在进行小更改后等待缓存过期会降低我的工作效率 当我更改为 PHP 5 5 3 时出现问题 更改回来并不能解决问题 经过研究 我采取了以下步骤来 未成功 禁用缓存 注释掉 php ini 中的 OPcac
  • 引用的项目x不存在

    大家好 我将一个项目的解决方案从vs2008升级到vs2010 但现在我有一个奇怪的问题 我在多个解决方案中引用了一个项目 3个解决方案 在其中两个解决方案中 引用出现错误 我可以添加引用 项目引用 但是当我构建时 我收到警告 引用的项目
  • iOS Siri 意图扩展“我没有看到适用于该功能的应用程序。您需要下载一个。”

    我正在编写一个 Swift 框架 其中包含 Siri 意图定义文件和代码 可从主应用程序 Today 扩展和 Siri 意图扩展中使用 我正在使用 Cocoapods 来分发框架 它位于私人存储库中 因此我无法共享框架本身 这非常适合从应用
  • JTable 中的格式化字段问题 - Integer 和 Double 之间的差异

    更新 已确认为错误当 columnClass 为 Double 时 JTable 无法将给定对象格式化为 Number 错误 ID 7051636 https bugs java com bugdatabase view bug bug i
  • Docker:入口点的覆盖涉及CMD规范?

    这是我纯粹好奇的问题 我必须个性化 Docker 映像 特别是这是我的 dockerfile 的摘录 ARG DEFAULT PHP VERSION FROM php DEFAULT PHP VERSION DEFAULT PHP VERS
  • 使用带有部分模板文件的 i18n gem 时出现问题

    我正在使用 Ruby on Rails 3 1 我想知道如何正确处理与部分模板文件相关的国际化 那是 在我的app views users flag html erb我有的文件 在我的app views users flag form ht
  • Ace Editor 获取当前选定的行号和文本

    我目前正在使用 Ace Editor 但我在文档中找不到与检索当前所选行号及其文本相关的任何内容 有任何想法吗 首先 定义 选定行 ace 中的选择可以跨多行设置 如果您的意思是 未设置选择 当前行是光标闪烁的行 var currline
  • Beautiful Soup 中 find_all 方法的返回类型是什么?

    from bs4 import BeautifulSoup SoupStrainer from urllib request import urlopen import pandas as pd import numpy as np imp
  • Web2Py 无法连接到 MSSQL

    我无法让 web2py 连接到 mssql
  • python setup.py Egg_info 失败,错误代码 1

    我正在运行 Ubuntu 17 04 全新安装 并且已经安装了 pip 但是 当我尝试安装任何东西时 我得到以下信息 命令 python setup py Egg info 失败 错误代码为 1 tmp pip build kBfUEp k
  • 如何将 interface{} 转换回其原始结构?

    我需要一种方法将结构 接口动态转换回其原始对象 我可以在里面添加方法 函数 基本上我需要这样的东西 MyStruct gt Interface gt MyStruct 在最终转换时 除了结构内部的内容之外 我对原始结构一无所知 所以我不能这
  • 如何输出使用 for_each 创建的资源的多个实例的属性?

    假设我有一个环境地图要提供给 for each environments 0 dev 1 test 2 stage 然后 无论出于何种原因 我想为每个环境创建一个 Azure 资源组 resource azurerm resource gr
  • 发生错误:“无法调用 nvarchar 上的方法。”

    我编写了一个查询来查找与特定问题相关的答案 但在运行此代码时收到此错误 无法调用 nvarchar 上的方法 select Posts Id as Answer ParentId as question User DisplayName a
  • Safari 移动版全屏

    我正在尝试在 iPhone Web 应用程序上设置全屏模式 我已阅读 Apple 关于 apple mobile web app capable 元标记的文档 但它不起作用 你能帮助我吗 谢谢 确保你按照
  • 如何在 jupyter 笔记本中导入 scikit-learn?

    我创建了一个新的 conda 环境来使用 scikit learn 并使用conda install
  • 确定 std::istream 长度的更好方法?

    有没有比以下更好的方法来确定 std istream 的长度 std istream pcStream GetSomeStream pcStream gt seekg 0 ios end unsigned int uiLength pcSt
  • GWT 与 ScriptSharp 的优缺点 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 根据条件确定要连接的表

    我不确定我是否错过了正确的搜索 但我无法得到与我一样的确切问题 这是类似但不准确的东西 https stackoverflow com questions 11533636 determining which table to join t