Left Outer Join, только если столбец существует (сервер SQL)

Я использую SQL Server Express и пытаюсь извлечь разные столбцы из разных таблиц, используя LEFT OUTER JOIN, Это прекрасно работает, но только если существуют все столбцы. В течение последнего часа я читал, как добавить условие, чтобы LEFT OUTER JOIN делается только если столбец существует.

Смотрите код ниже (проблема является последней 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, но что бы я ни делал, я получаю сообщение об ошибке "Неверное имя столбца" Путь к странице "".

3 ответа

Решение

Я не думаю, что вы можете сделать это в одном запросе, способ, который я предлагаю вам использовать, что-то вроде этого:

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

Нет, это невозможно. Схема базы данных не должна меняться у вас под рукой, поэтому приложение должно знать об этом и только те таблицы и столбцы, которые существуют.

Если это вообще возможно, вам следует изменить схему базы данных, чтобы таблицы, для которых необходимо выполнить запрос, не отличались незначительно или даже лучше, чтобы вам вообще не нужно было выполнять его для нескольких таблиц. Вероятно, путем объединения информации в одной таблице со столбцом, указывающим на ее происхождение.

Используйте динамический 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)
Другие вопросы по тегам