itsource

보기에서 임시 테이블을 만들고 선택한 후 삭제할 수 있습니까?

mycopycode 2023. 7. 31. 21:22
반응형

보기에서 임시 테이블을 만들고 선택한 후 삭제할 수 있습니까?

1개의 뷰를 변경해야 하며 SELECT 전에 2개의 임시 테이블을 소개하고 싶습니다.

이것이 가능합니까?어떻게 하면 좋을까요?

ALTER VIEW myView
AS 

SELECT *
INTO #temporary1

SELECT *
INTO #temporary2

SELECT * FROM #temporary1
UNION ALL 
SELECT * FROM #temporary1

DROP TABLE #temporary1
DROP TABLE #temporary2

제가 이것을 시도하면 ALTER VIEW가 배치의 유일한 문이어야 한다고 불평합니다.

어떻게 하면 이를 달성할 수 있을까요?

아니요, 보기는 단일 보기로 구성됩니다.SELECT진술.보기에서 테이블을 만들거나 삭제할 수 없습니다.

일반적인 표식(CTE)으로 문제를 해결할 수 있습니다.CTE는 단일 문의 실행 범위 내에서 정의된 임시 결과 집합이며 뷰에서 사용할 수 있습니다.

예(여기서 발췌) - 당신은 다음을 생각할 수 있습니다.SalesBySalesPerson임시 테이블로서의 CTE:

CREATE VIEW vSalesStaffQuickStats
AS
  WITH SalesBySalesPerson (SalesPersonID, NumberOfOrders, MostRecentOrderDate)
      AS
      (
            SELECT SalesPersonID, COUNT(*), MAX(OrderDate)
            FROM Sales.SalesOrderHeader
            GROUP BY SalesPersonID
      )
  SELECT E.EmployeeID,
         EmployeeOrders = OS.NumberOfOrders,
         EmployeeLastOrderDate = OS.MostRecentOrderDate,
         E.ManagerID,
         ManagerOrders = OM.NumberOfOrders,
         ManagerLastOrderDate = OM.MostRecentOrderDate
  FROM HumanResources.Employee AS E
  INNER JOIN SalesBySalesPerson AS OS ON E.EmployeeID = OS.SalesPersonID
  LEFT JOIN SalesBySalesPerson AS OM ON E.ManagerID = OM.SalesPersonID
GO

성능 고려 사항

CTE와 임시 테이블 중 어느 것이 더 성능이 좋습니까?

당신은 당신이 하려고 하는 것을 성취할 수 있습니다 , 사용합니다.Stored Procedure쿼리 결과를 반환합니다.Views이와 같은 작업에는 적합하지 않습니다.

불가능하지만 CTE를 시도하면 다음 코드가 됩니다.

ALTER VIEW [dbo].[VW_PuntosDeControlDeExpediente]
AS
    WITH TEMP (RefLocal, IdPuntoControl, Descripcion) 
    AS 
    (
        SELECT 
              EX.RefLocal
            , PV.IdPuntoControl
            , PV.Descripcion
        FROM [dbo].[PuntosDeControl] AS PV
        INNER JOIN [dbo].[Vertidos] AS VR ON VR.IdVertido = PV.IdVertido
        INNER JOIN [dbo].[ExpedientesMF] AS MF ON MF.IdExpedienteMF = VR.IdExpedienteMF
        INNER JOIN [dbo].[Expedientes] AS EX ON EX.IdExpediente = MF.IdExpediente
    )
    SELECT 
          Q1.[RefLocal]
        ,    [IdPuntoControl] = ( SELECT MAX(IdPuntoControl) FROM TEMP WHERE [RefLocal] = Q1.[RefLocal] AND [Descripcion] = Q1.[Descripcion] )
        , Q1.[Descripcion]
    FROM TEMP AS Q1
    GROUP BY Q1.[RefLocal], Q1.[Descripcion]
GO

임시 테이블 대신 다른 SQL 보기를 만든 다음 기본 SQL 보기에서 참조해 보십시오.즉, 뷰 내의 뷰입니다.그런 다음 기본 보기를 작성한 후 첫 번째 보기를 삭제할 수 있습니다.

언급URL : https://stackoverflow.com/questions/8256466/is-it-possible-to-create-a-temporary-table-in-a-view-and-drop-it-after-select

반응형