sql-server - T-SQL 视图问题
问题描述
我正在与 Business Objects 开发人员一起创建一个新报告。他希望我创建一个他可以查询的视图。我的问题是我已经成功创建了一个查询,并且已经验证它可以工作,但是当我使用它/稍微修改它来创建一个视图时,它不会返回正确的结果。所以我的问题有两个:1.我错过了什么?为什么我的视图返回的结果与我的查询不同?2. 有没有人熟悉Business Objects,我的查询可以在Business Objects 中配置吗?我们的 Business Objects 开发人员声称无法做到。
这是我的有效 SQL 查询。请注意以下几点: - 它基本上是一个联合,如果第一部分中已经存在匹配记录(基于我的密钥),我会从联合的第二部分中删除记录。- 有一个输入参数,LOT,使用了 3 次。- 联盟的两个部分都在查询视图。那应该没关系。
SELECT [Lot]
,[Qty]
,[MOP]
,[MOP Revision]
,[G_MOP]
,[G_MOP Revision]
,[Scrap Code]
,[MOP Threshold]
,[Txn Date]
,[Qty Built]
,[Catalog]
,[Comments]
FROM [MES_QAS].[MES].[V_BOBJ_SCRAP_MOP_HISTORY]
where lot = 'TF1_80400_QA7'
UNION
(SELECT [Lot]
,[Qty]
,[MOP]
,[MOP Revision]
,[G_MOP]
,[G_MOP Revision]
,[Scrap Code]
,[MOP Threshold]
,[Txn Date]
,[Qty Built]
,[Catalog]
,[Comments]
FROM [MES_QAS].[MES].[V_BOBJ_NO_SCRAP_ALL_MOP_HISTORY]
where lot = 'TF1_80400_QA7'
AND [LOT]+IsNull([MOP],[G_MOP]) NOT IN (SELECT [Lot] + IsNull([MOP],[G_MOP]) FROM [MES].[V_BOBJ_SCRAP_MOP_HISTORY] where lot = 'TF1_80400_QA7')
)
ORDER BY Lot, mop, g_mop
接下来,我创建了一个如下视图(我去掉了 LOT 作为参数):
CREATE VIEW [MES].[V_BOBJ_SCRAP_ALL_MOP_HISTORY] (
"Lot"
,"Qty"
,"MOP"
,"MOP Revision"
,"G_MOP"
,"G_MOP Revision"
,"Scrap Code"
,"MOP Threshold"
,"Txn Date"
,"Qty Built"
,"Catalog"
,"Comments"
)
AS
(
(
SELECT [Lot]
,[Qty]
,[MOP]
,[MOP Revision]
,[G_MOP]
,[G_MOP Revision]
,[Scrap Code]
,[MOP Threshold]
,[Txn Date]
,[Qty Built]
,[Catalog]
,[Comments]
FROM [MES].[V_BOBJ_SCRAP_MOP_HISTORY] H1
)
UNION
(
SELECT [Lot]
,[Qty]
,[MOP]
,[MOP Revision]
,[G_MOP]
,[G_MOP Revision]
,[Scrap Code]
,[MOP Threshold]
,[Txn Date]
,[Qty Built]
,[Catalog]
,[Comments]
FROM [MES].[V_BOBJ_NO_SCRAP_ALL_MOP_HISTORY] A
WHERE [LOT]+IsNull([MOP],[G_MOP]) NOT IN (SELECT [Lot] + IsNull([MOP],[G_MOP]) FROM [MES].[V_BOBJ_SCRAP_MOP_HISTORY] H2)
)
)
;
所以这就是问题所在:当我运行以下查询时,我没有得到正确的结果——我只从联合的顶部得到结果,而不是底部:
SELECT * FROM [MES].[V_BOBJ_SCRAP_ALL_MOP_HISTORY]
where lot = 'TF1_80400_QA7'
同样,我的两个问题是: 1. 我错过了什么 - 为什么我的观点不起作用?有没有办法解决它?2. 我的第一个查询可以在 Business Objects 中建模吗?
布莱恩·帕尔默,科罗拉多州莱克伍德
解决方案
我认为您需要构建的是一个表函数,实际上 - 在您过滤视图的方式与第一个硬编码 SQL 之间存在一些细微的差异
IE
where lot = 'TF1_80400_QA7'
AND [LOT]+IsNull([MOP],[G_MOP]) NOT IN (SELECT [Lot] + IsNull([MOP],[G_MOP]) FROM
[MES].[V_BOBJ_SCRAP_MOP_HISTORY] where lot = 'TF1_80400_QA7')
推荐阅读
- python-3.x - 如何删除边框并在栏本身中添加名称
- node.js - 安装 Angular / 最新版本
- ansible - 如何通过在ansible playbook中测试与`lookup('dig', ...)`的(不)相等性来习惯性地过滤主机名列表
- wix - 如何使用 Wix Burn 安装根证书?
- php - PHP - 更改变量名
- reactjs - 在 `componentDidMount` 生命周期方法中检查组件是否挂载不是很可笑吗?
- javascript - 如何使用包装器控制按钮的切换
- java - 如何对作为 Mockito 中的构建器类的方法参数进行单元测试?
- javascript - 我可以将参数传递给 Google Charts Load 的回调函数吗?
- ios - 提高读取 UPC-A 条码 Objective-C (Xcode) 的速度