1

私は SQL Server Express を使用しており、を使用して異なるテーブルから異なる列を取得しようとしていますLEFT OUTER JOIN。うまく機能していますが、すべての列が存在する場合のみです。LEFT OUTER JOINそのため、列が存在する場合にのみ条件を追加する方法を過去1時間読んでいました。

以下のコードを参照してください(存在しないLEFT OUTER JOINため、問題は最後です):a.[Page Path]

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(EXISTSたが、何をしても「無効な列名 'ページ パス''」というエラーが表示されます。

4

3 に答える 3

2

単一のクエリでそれを行うことはできないと思います。使用することをお勧めする方法は、次のようなものです。

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
于 2012-11-16T12:47:20.150 に答える
0

いいえ、できません。データベーススキーマはユーザーの手で変更されることは想定されていないため、アプリケーションはそれを認識し、存在するテーブルと列のみをクエリする必要があります。

可能であれば、データベーススキーマを変更して、クエリを実行する必要のあるテーブルにわずかな違いがないか、さらに優れているようにして、複数のテーブルでクエリを実行する必要がないようにする必要があります。おそらく、単一のテーブル内の情報と、その起源を示す列を組み合わせることによって。

于 2012-11-16T12:51:31.987 に答える
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)
于 2012-11-16T14:30:26.550 に答える