sql - SQL Server:左连接下存在的位置
问题描述
无法使用左连接的代码
LEFT JOIN
(SELECT
CASE
WHEN EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'TABLE_A')
THEN
SELECT q23.MRID, q23.NTP
FROM
(SELECT MRID, NSIA4 NTP FROM TABLE_A a, TABLE_B b
WHERE a.obj = b.co
UNION
SELECT MRID, CASE WHEN a.NBR = 0 then NTPSERV END NTP FROM TABLE_C a, TABLE_B b WHERE a.obj = b.co) q23
ELSE SELECT q23.MRID , q23.NTP from ( SELECT MRID, CASE WHEN a.NBR = 0 then NTPSERV END NTP FROM TABLE_C a, TABLE_B b WHERE a.obj = b.co) q23
END ) q24 ON q0.MRID = q24.MRID
这将结合两个表的结果并将它们显示为联合。由于我们有多个数据库并且在某些数据库中 TABLE_A 不存在。
解决方案
您似乎在 SQL 中混淆了不同的概念。一个CASE
表达式就是这样: 一个标量表达式。它返回具有特定类型的列值。它不是控制流,而是数据流(也就是说,它只是对查询中的数据进行操作)。
SQL 查询引用特定的表和列。这些不能是动态的或有条件的,除非您在 T-SQL 中使用动态 SQL。T-SQL 是一种脚本语言,它支持条件控制流逻辑:
declare @sql nvarchar(max);
if exists (select 1 from information_schema.tables where table_name = 'Table_a')
begin
@sql = 'select col from table_a';
end;
else
begin
@sql = 'select col from table_b';
end;
exec sp_executesql @sql;
推荐阅读
- c - cs50沙箱for循环问题
- python - Sqlite3:如何实现高性能读/写并发?
- javascript - Javascript ES6 - 在将函数或变量导入不同的 .js 文件之前等待模块完成执行
- node.js - 升级到 vue-cli-4 后,相对路径不再适用于标准导入
- python - 使用 pandas 数据集按功能分组。Cronbach's alpha 与 Python 中的分组数据集
- cmake - 缺少 clang 标头
- github - 打开拉取请求或更新 PR 分支时如何运行 GitHub 操作?
- python - 在 Markdown 到 HTML 转换后返回更改的文本
- c# - 我可以在指定时间内将浮点值从 x 更改为 y 吗?
- azure - Azure webjobs 从 Jenkins 管道发布