2013-07-19 6 views
0

Можно ли вытащить значения из двух разных таблиц на основе значения столбца? Например, у меня есть таблица с булевым столбцом, которая возвращает 0 или 1 в зависимости от того, что конечный пользователь выбирает в нашей программе. 0 означает, что я должен потянуть значения по умолчанию. 1 означает использование данных пользователя.Связать таблицы на основе значения столбца

Если мой стол Table1 выглядел следующим образом:

Case ID  Boolean 
==================== 
    1    0 
    2    1 
    3    1 
    4    0 
    5    0 

Тогда я должен был бы тянуть Case идентификаторы 1,4 и 5 в соответствующие данные из таблицы Default и Case идентификаторами 3 и 4 в соответствующие данные из таблицы UserDef. Тогда мне придется принимать эти значения, комбинировать их и изменять их по идентификатору case, чтобы сохранить порядок в результирующей таблице.

Я довольно неопытный с SQL, но я пытаюсь учиться. Любая помощь или предложения приветствуются. Спасибо заранее за вашу помощь.

ответ

1

Что-то вроде этого:

SELECT 
    t1.CaseID 
,CASE WHEN t1.Boolean = 1 THEN dt.Col1 ELSE ut.Col1 END AS Col1 
,CASE WHEN t1.Boolean = 1 THEN dt.Col2 ELSE ut.Col2 END AS Col2 
FROM Table1 t1 
LEFT JOIN DefaultTable dt ON dt.CaseID = t1.CaseID 
LEFT JOIN UserDefTable ut ON ut.CaseID = t1.CaseID 
ORDER BY t1.CaseID 

Вы вступаете в обеих таблицах, а затем использовать CASE в SELECT выбрать, из которых один для отображения данных.

Вариант B:

WITH CTE_Combo AS 
(
    SELECT 0 as Boolean, * FROM Default  --replace * with needed columns 
    UNION ALL 
    SELECT 1 AS Boolean, * FROM UserDef  --replace * with needed columns 
) 
SELECT * FROM Table1 t 
LEFT JOIN CTE_Combo c ON t.CaseID = c.CaseID AND t.Boolean = c.Boolean 
ORDER BY t.CaseID 

Это может быть еще проще - с помощью CTE сделать объединение двух таблиц, добавив искусственный столбец, а затем присоединиться к КТР и вашу таблицу, используя как ID и флаг столбца.

+0

Благодарим за отзыв. dt.Col1 и dt.Col2 - соответствующие столбцы данных? Что делать, если я не знаю, сколько столбцов имеет таблица по умолчанию или таблица userdef? Я знаю, что у них будет одинаковое количество столбцов, но количество столбцов неизвестно. –

+0

@RolandP Попробуйте вариант B ans оставить *. Если обе таблицы имеют одинаковые столбцы, которые должны работать. Хотя использовать «SELECT *» - это не очень хорошая практика - вы должны всегда пытаться называть свои столбцы. –

+0

Понял. К сожалению, столбцы являются динамическими и могут быть добавлены или удалены. Благодаря! –

1
SELECT t1.CaseID, 
     ISNULL(td.data, tu.data) userData -- pick data from table_default 
             -- if not null else from table_user 
    FROM table1 t1 
    LEFT JOIN table_default td ON t1.CaseID = td.CaseID -- left join with table_default 
          AND t1.Boolean = 0  -- when boolean = 0 
    LEFT JOIN table_user tu ON t1.CaseID = tu.CaseID -- left join with table_user 
         AND t1.Boolean = 1  -- when boolean = 1 
    ORDER BY t1.CaseID 
Смежные вопросы