【问题标题】:T-SQL View issueT-SQL 视图问题
【发布时间】:2018-11-07 18:52:15
【问题描述】:

我正在与 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 中建模吗?

布赖恩·帕尔默, 科罗拉多州莱克伍德

【问题讨论】:

  • 正在使用 BusinessObjects 中的什么工具以及您使用的是哪个版本的 BusinessObjects?我问的原因是,在 4.1 Support Pack 6 中,Web Intelligence 中重新引入了一种称为 freehand SQL 的东西。 dallasmarks.com/web-intelligence-and-free-hand-sql

标签: sql-server tsql business-objects sql-view


【解决方案1】:

我认为您需要构建的是 table function,实际上 - 在您过滤视图的方式与第一个硬编码 SQL 之间存在一些细微差别

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')

【讨论】:

    【解决方案2】:

    问题出在view 中的subselect,因为它没有被lot 过滤。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-23
      • 2012-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多