T-SQL View проблема - PullRequest
       19

T-SQL View проблема

0 голосов
/ 07 ноября 2018

Я работаю с разработчиком Business Objects над созданием нового отчета. Он хочет, чтобы я создал представление, которое он может запросить. Моя проблема в том, что я успешно создал Query и проверил, что он работает, но когда я использую его / слегка изменяю его для создания представления, он не возвращает правильные результаты. Итак, мой вопрос состоит из двух частей: 1. Чего мне не хватает? Почему мое представление не возвращает те же результаты, что и мой запрос? 2. Кто-нибудь знаком с Business Objects и можно ли настроить мой запрос в Business Objects? Наш разработчик Business Objects утверждает, что это невозможно сделать.

Вот мой SQL-запрос, который работает. Обратите внимание на следующее: - По сути, это Союз, в котором я исключаю записи из второй части Союза, если в первой части уже существует соответствующая запись (на основе моего ключа). - Существует ОДИН входной параметр, LOT, который используется три раза. - Обе части Союза запрашивают мнения. Это не должно иметь значения.

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?

Брайан Палмер, Лейквуд, Колорадо

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Проблема в вашем subselect в view, потому что он не фильтруется по lot.

0 голосов
/ 07 ноября 2018

Я думаю, что вам нужно создать табличную функцию , на самом деле - существуют некоторые тонкие различия в том, как вы фильтруете представление по сравнению с первым жестко закодированным 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')
...