Database/MSSQL

[MSSQL] With 문

BeomBe 2024. 2. 8. 14:10
반응형

With

"WITH" 구문은 Microsoft SQL Server에서 사용되는 일종의 임시 테이블이나 쿼리의 일부분을 정의할 때 사용됩니다. 이 구문을 사용하여 임시 결과 집합을 생성하고 이를 기반으로 다른 쿼리를 실행할 수 있습니다.

 

* WITH 구문을 사용하면 복잡한 쿼리를 더 간결하게 작성하고, 임시 결과를 활용하여 다른 쿼리를 실행할 수 있습니다.

 

주로 두 가지 방식으로 사용됩니다.

  1. "Common Table Expression (CTE)"를 정의하는 경우
  2. "WITH" 구문을 사용하여 "INSERT", "UPDATE", "DELETE" 문에 임시 테이블을 정의하는 경우입니다.

먼저 Common Table Expression(CTE)를 사용하는 예시를 보여드리면,

WITH Sales_CTE AS (
    SELECT ProductID, SUM(Quantity) AS TotalSales
    FROM Sales
    GROUP BY ProductID
)
SELECT ProductID, TotalSales
FROM Sales_CTE
WHERE TotalSales > 100

 

위의 예시에서 "Sales_CTE"는 임시 테이블로 사용됩니다. 이 CTE는 "Sales" 테이블에서 각 제품의 총 판매량을 계산하고, 이를 기반으로 판매량이 100보다 큰 제품을 조회하는 메인 쿼리에서 사용됩니다.

 

아래는 "With" 구문을 이용해서 INSERT문을 실행하는 예시입니다.

WITH NewEmployees AS (
    SELECT 'John' AS FirstName, 'Doe' AS LastName
    UNION ALL
    SELECT 'Jane', 'Smith'
)
INSERT INTO Employees (FirstName, LastName)
SELECT FirstName, LastName
FROM NewEmployees

 

위의 예시에서 "NewEmployees"는 임시 테이블로 사용됩니다. 이 테이블은 "INSERT INTO" 문을 실행할 때 새로운 직원 데이터를 제공합니다.

 

 

With문 없이 결과를 얻으려면,

서브쿼리를 사용해 원하는 결과를 얻을수있습니다.

// With 사용
WITH Sales_CTE AS (
    SELECT ProductID, SUM(Quantity) AS TotalSales
    FROM Sales
    GROUP BY ProductID
)
SELECT ProductID, TotalSales
FROM Sales_CTE
WHERE TotalSales > 100


// 서브쿼리 사용
SELECT ProductID, TotalSales
FROM (
    SELECT ProductID, SUM(Quantity) AS TotalSales
    FROM Sales
    GROUP BY ProductID
) AS Sales_Subquery
WHERE TotalSales > 100

 

위의 예시에서 "Sales_CTE" CTE 대신 서브쿼리를 사용하여 똑같은 결과를 얻을 수 있습니다. 서브쿼리는 CTE와 마찬가지로 중간 결과를 생성하고 이를 기반으로 메인 쿼리를 실행합니다.

 

마찬가지로 "INSERT" 문에 대해서도 서브쿼리를 사용할 수 있습니다. CTE를 사용한 예시를 다시 살펴보겠습니다.

// With 사용
WITH NewEmployees AS (
    SELECT 'John' AS FirstName, 'Doe' AS LastName
    UNION ALL
    SELECT 'Jane', 'Smith'
)
INSERT INTO Employees (FirstName, LastName)
SELECT FirstName, LastName
FROM NewEmployees


// 서브쿼리 사용
INSERT INTO Employees (FirstName, LastName)
SELECT FirstName, LastName
FROM (
    SELECT 'John' AS FirstName, 'Doe' AS LastName
    UNION ALL
    SELECT 'Jane', 'Smith'
) AS NewEmployees_Subquery

 

위의 예시에서도 CTE 대신 서브쿼리를 사용하여 동일한 결과를 얻을 수 있습니다.

"WITH" 구문을 사용하지 않고도 서브쿼리를 활용하여 동일한 결과를 얻을 수 있는 다른 방법이 있습니다.

따라서 사용자의 선택에 따라 맞춰 사용하시면 됩니다!

반응형