2012-04-24 1 views
0

어떻게 다음 T-SQL 문을 사용할 수 있습니까? 모든 CASE 옵션에 대해 @Type 변수를 설정하는 하위 쿼리를 복사 할 수 있지만 하위 쿼리는 한 번만 실행합니다. 가능한가?동일한 SELECT 문에서 비교를 위해 SQL 변수를 사용하십시오.

SELECT 
     @Type = (SELECT CustomerType FROM dbo.Customers WHERE CustomerId = (SELECT CustomerId FROM dbo.CustomerCategories WHERE CatId= @CatId)), 
     CASE 
     WHEN @Type = 'Consumer'THEN dbo.Products.FriendlyName 
     WHEN @Type = 'Company' THEN dbo.Products.BusinessName 
     WHEN @Type IS NULL THEN dbo.Products.FriendlyName 
     WHEN @Type = '' THEN dbo.Products.FriendlyName 
     END Product, 
     ... 
FROM 
     Products 
INNER JOIN 
     Category 
... 

편집는 : D가 확인합니다 : 내 예를 들어 지금 실행 ... 돌아 내일 ... 짧은을 서명 미안 가지고 있지만 아이들을 데리러 ... 더 구체적으로 수정 내일 다시. 고마워!!

명확화 : 하위 쿼리의 where-clasue에서 기본 쿼리의 join stmt에 사용 된 테이블의 열을 참조해야합니다. 분리하면 @Type이 관련성을 잃을 것입니다.

+0

당신은 더 구체적으로해야합니다의 일환으로 변수를 반환합니다. –

+0

당신은 여전히 ​​너무 애매합니다. 어떻게해야한다고 생각하는지 알려주지 않고 무엇을해야하는지 알려주세요. 쿼리와 변수가 작동하는 방식에 대한 근본적인 누락 된 링크가 있다고 생각합니다. 그러나 샘플 데이터와 원하는 결과를 보여 주면 우리는 꽤 똑똑한 사람들이며 당신이 원하는 것을 성취 할 수있는 방법을 찾아 낼 수 있습니다. –

+0

사용중인 SQL Server 버전을 지정하는 경우에도 유용합니다! –

답변

4

두 가지 작업으로 분리하지 않는 이유는 무엇입니까? 당신은 그 (것)들을 단일 성명으로 화려하게하는 것을 시도해서 무엇을 얻는 는다는 것을 생각합니까?

SELECT @Type = (subquery); 

SELECT CASE WHEN @type = 'Consumer'... 

무딘 소리가 날 위험이 있으므로 실제로 변수가 필요합니까? 이유 :

해당 양식을 사용하면 값을 변수에 할당 할 것인지 또는 결과를 검색 할 것인지 결정해야합니다.

여러 변수를 가져올 수도 있습니다 (예 :

SELECT @Col1 = Col1, @Col2 = Col2 
    FROM (<subquery>) AS x; 

-- then refer to those variables in your other query: 

SELECT *, @Col1, @Col2 FROM dbo.Products WHERE Col1 = @Col2; 

그러나 충분히 구체적인 내용을 공유하지 않았으므로 이는 모두 추측입니다.

EDIT 이제는 실제 검색어를 얻었으므로 조금 더 잘 이해할 수있게되었으므로 새로운 버전을 작성할 수 있는지 알아 보겠습니다. 나는 당신이 단지 @Type 변수를 저장하려고 시도했기 때문에 쿼리 내에서 그것을 재사용 할 수 있고 나중에 (이 쿼리 이후에) 값을 저장하려고 시도하지 않았다고 가정 할 것이다.

SELECT CASE 
     WHEN c.CustomerType = 'Company' THEN p.BusinessName 
     WHEN COALESCE(c.CustomerType, '') IN ('Consumer', '') THEN p.FriendlyName 
    END 
    --, other columns 
FROM dbo.Products AS p 
INNER JOIN dbo.Category AS cat 
    ON p.CatId = cat.CatId 
INNER JOIN dbo.CustomerCategories AS ccat 
    ON ccat.CatId = cat.CatId 
INNER JOIN dbo.Customers AS c 
    ON c.CustomerId = ccat.CustomerId 
WHERE cat.CategoryId = @CatId; 

일부 노트 :

  • 난 당신이 하위 쿼리이 접근 할 수있는 권리 방법입니다 생각 이유를 모르겠어요. 일반적으로 적절한 조인을 작성하고 SQL Server가 현명한 쿼리를 사용하지 않고 쿼리를 최적화하고 개별 쿼리를 주로 쿼리와 독립적으로 최적화하는 것이 훨씬 낫습니다. 적절한 조인은 하위 쿼리를 통해 잠재적으로 구체화 될 수있는 행 앞면을 제거하는 데 도움이됩니다. SQL Server의 작업을 신뢰하십시오.이 경우 작업은 여러 테이블에 걸쳐 조인을 수행하는 것입니다.
  • SELECT에 범주 이름을 표시 할 필요가없는 경우 dbo.Category에 대한 조인이 필요하지 않을 수도 있습니다. 그렇다면 where 절을 변경하고 해당 조인을 제거하십시오 (대신 CusomterCategories에 조인하십시오).
  • 모든 가능한 시나리오를 다룬 경우 두 번째 사례를 간단한 ELSE로 변경할 수 있습니다.
  • 제품과 범주 간의 조인에 대한 가정을했습니다 (범주가 다른 것과 같이 복수가 아닌 이유는 무엇입니까?). 이것이 아니라면 우리를 기입하십시오.당신은 그렇게 할 수 없습니다
+0

은 이들을 분리 할 수 ​​없습니다. 세트 작업을 위해 이들이 함께 필요합니다. – Laguna

+0

"설정 가동"이 의미하는 바를 설명 할 수 있습니까? –

+0

lol (나는 웃고 있어요) ... 기본적으로 하위 쿼리의 where-clasue에서 기본 쿼리의 테이블 조인에 사용 된 테이블의 열을 참조해야한다는 것을 의미합니다 ... 아마도 아직 명확하지 않습니다. ... pls 내가 명확히 할 수있는 구체적인 정보를 알려주십시오. 감사! – Laguna

4

, 다음과 같은 오류를 데이터 검색 작업과 함께 사용할 수 없습니다 있어야 변수에 값을 할당

하는 SELECT 문을 얻을 것이다.

는 두 개의 분리 한 다음 select 문

+0

그들을 구분할 수 없습니다. 세트 작업을 위해 이들이 함께 필요합니다. – Laguna

+2

변수에 값을 할당 할 수없고 동시에 결과 집합을 반환 할 수는 없습니다. – SQLMenace

+0

잘 알고 있습니다. 감사. 하위 쿼리를 여러 번 실행하지 않는 방법이 있습니까? – Laguna

관련 문제