2012-11-16 2 views
1

SQL Server Express를 사용 중이고 다른 테이블에서 다른 열을 LEFT OUTER JOIN을 사용하여 가져 오려고합니다. 모든 컬럼이 존재하는 경우에만 작동합니다. 그래서 저는 지난 시간 동안 LEFT OUTER JOIN이 열이 존재하는 경우에만 완료되도록 조건을 추가하는 방법을 읽었습니다.왼쪽 외부 조인 열만 존재하는 경우 (SQL 서버)

참조 아래 코드 (문제가 마지막 LEFT OUTER JOIN입니다 a.[Page Path] 때문에 존재하지 않음) : 나는 오류가 무엇 이건 내가 IF(EXISTS을 시도했습니다

SELECT 
    b.[Page ID], 
    ISNULL(b.[Page Group],'Other Landing Page') AS [Landing Page Group], 
    ISNULL(c.[Page Group],'Other Second Page') AS [Second Page Group], 
    ISNULL(d.[Page Group],'Other Page') AS [Page Path Group], 
    a.* 

FROM [mychoice-data-b9BwZvd] a 


LEFT OUTER JOIN [mychoice-pagedims] b 
ON 
    (a.[Landing Page Path] LIKE b.[Page ID]) 


LEFT OUTER JOIN [mychoice-pagedims] c 
ON 
    (a.[Second Page Path] LIKE c.[Page ID]) 


LEFT OUTER JOIN [mychoice-pagedims] d 
ON 
    a.[Page Path] LIKE d.[Page ID] 
    WHERE a.[Page Path] IS NOT NULL 

하지만 '잘못된 열 이름'페이지 경로 ''.

if (
    select COUNT(*) 
    from sys.objects so 
    inner join sys.columns col 
    on so.object_id = col.object_id 
    where so.type = 'U' and so.name = 'tablename' and col.name = 'colname' 
) > 0 

-- column exists -> write select with the join 

else 

-- column does not exist, don't include the join 
+2

는 [mychoice - 데이타 - b9BwZvd] 런타임시 생성된다? 열이 존재하는지 여부를 모르는 이유는 무엇입니까? – fnurglewitz

+0

SQL 쿼리를 만들려고합니다. 다른 데이터 테이블 (다른 열이있을 수 있음)에서 실행할 수 있으며 테이블 이름 만 변경합니다. 실제로이 쿼리를 사용하여 PowerPivot으로 데이터를 가져옵니다. –

답변

2

는, 당신이 사용하는 것이 좋습니다 방법은 다음과 같이한다. 데이터베이스 스키마는 사용자의 손으로 변경되지 않아야하므로 응용 프로그램은이를 알고 있어야하며 존재하는 테이블과 열만 쿼리해야합니다.

가능하다면 데이터베이스 스키마를 변경해야 쿼리를 실행해야하는 테이블이 약간 다르거 나 더 좋기 때문에 여러 테이블에서 실행할 필요가 없습니다. 아마도 하나의 테이블에있는 정보를 원점을 나타내는 열과 결합하면 가능할 것입니다.

+0

감사합니다. 당신, 내가 가진 다른 통합을 기반으로 Excel을 사용하여 필요한 쿼리를 만들도록 선택했습니다. SQL 만 사용하여 하나의 쿼리로 수행 할 수 없음을 알리는 데 도움이됩니다. –

0

아니, 불가능 : 나는 당신이 하나의 쿼리에서 그렇게 할 수 있다고 생각하지 않습니다

0

사용하는 동적 SQL

DECLARE 
    @SQL VARCHAR(MAX)=' 
SELECT 
    b.[Page ID], 
    ISNULL(b.[Page Group],''Other Landing Page'') AS [Landing Page Group], 
    ISNULL(c.[Page Group],''Other Second PAGE'') AS [Second Page Group], 
    ISNULL(d.[Page Group],''Other Page'') AS [Page Path Group], 
    a.* 

FROM [mychoice-data-b9BwZvd] a 


LEFT OUTER JOIN [mychoice-pagedims] b 
ON 
    (a.[Landing Page Path] LIKE b.[Page ID]) 


LEFT OUTER JOIN [mychoice-pagedims] c 
ON 
    (a.[Second Page Path] LIKE c.[Page ID]) 


LEFT OUTER JOIN [mychoice-pagedims] d 
ON 
    '+ 
CASE 
    WHEN EXISTS (
     SELECT * 
     FROM sys.columns C 
     JOIN sys.tables T ON T.object_id = C.object_id 
     LEFT JOIN sys.schemas S ON S.Schema_id=T.Schema_id 
     WHERE 
      C.Name ='Page Path' AND 
      T.Name ='mychoice-pagedims'   
    ) 
    THEN 'a.[Page Path] LIKE d.[Page ID]' 
    ELSE '(1=0)' 
END+' 

WHERE a.[Page Path] IS NOT NULL 
' 
EXEC(@SQL)