2016-01-06 1 views
1

У меня есть две таблицы со следующими данными, и я использую Microsoft SQL Express для управления ими:SQL - Перемещение или обновление данных в первую пустую колонку в другой таблице

Table1

Name Col1 ColSwitch 
Row1 3  NULL 
Row2 7  NULL 
Row3 5  True 
Row4 12 True 
Row5 2  True 

Table2

Name Col1 Col2 Col3 
Row3 3  NULL NULL 
Row4 4  10 NULL 
Row6 2  3  9 
Row7 6  NULL NULL 

Я ищу, чтобы переместить строки из Table1 в Table2 когда ColSwitch является таковой t до True. я могу успешно сделать это с помощью следующих действий:

INSERT Table2 (Name, ColN) 
    SELECT Name, Col1 
    FROM Table1 
    WHERE ColSwitch LIKE 'True' 

Но моя проблема возникает, когда мне нужно, чтобы выбрать первый пустой столбец при обновлении существующих записей (Row3 и Row4 в примере). Я нашел пример, где был использован CASE WHEN ELSE, но я бы хотел избежать использования PHP на данный момент времени.

Просто используя предоставленный метод без PHP, заполните первый столбец столбцом с именем NULL. (Ниже)

SELECT Name, 
CASE 
    WHEN Col1 IS NULL THEN 'Col1' 
    WHEN Col2 IS NULL THEN 'Col2' 
    ELSE 'Col3' 
END as ColN 
FROM Table2 

Желаемый результат будет где первое поле NULL, в Table2 заменяется значением из Table1, или, альтернативно, при добавлении к Col3, если все уже заполнены.

Выход предполагая Row3 = 5, Row4 = 12 и Row5 = 2 из исходных таблиц на вершине.

Name Col1 Col2 Col3 
Row3 3  5  NULL 
Row4 4  10 12 
Row5 2  NULL NULL 
Row6 2  3  9 
Row7 6  NULL NULL 

Можно ли это сделать только с помощью простого SQL? Если да, пожалуйста, объясните, как наилучшим образом подойти к этому и, если возможно, привести пример :)

+0

Показать требуемый выход для ввода – lad2025

+0

код [MERGE заявление] (https://msdn.microsoft.com/en-us/library/bb510625.aspx) позволяет делать вставки и обновления в одном запросе , – JodyT

+0

Все столбцы NULL начинаются с первого NULL? Или может быть NULL в столбце 3 и значение в столбце 4? –

ответ

1

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

Решение 1:
Genarate dynamic SQL и выполнять его. Поскольку столбец динамический, вам нужно создать один INSERT для каждой строки.

SELECT @query='construct insert command text here' FROM Table2,Table1 
EXEC sp_executesql @query 

Решение 2: Если набор столбцов ограничено вы можете использовать команду MERGE. Вы должны добавить свои условия.

MERGE INTO Table2 
USING Table1 
ON Table1.Name=Table2.Name 
    WHEN MATCHED AND Table2.Col1 IS NULL 
    THEN UPDATE SET Col1=Table1.Col1 
    WHEN MATCHED AND Table2.Col2 IS NULL 
    THEN UPDATE SET Col2=Table1.Col1 
    WHEN NOT MATCHED BY SOURCE 
    THEN INSERT (Name,Col1) VALUES Table1.Name, Table1.Col1 
+0

Спасибо Patrik, в настоящее время это мое общее решение, и оно еще не привязано ни к чему еще, поэтому единственная проблема, с которой я столкнулась, заключается в создании SQL-запроса для перемещения данных из Table1 в Table2. Я только начинаю проект базы данных здесь, поэтому я открыт для лучших альтернатив дизайну базы данных. Конечно, было бы предпочтительно иметь возможность использовать текущий дизайн. Я смотрю на решение 2, но мне кажется, что это потребовало бы, чтобы я отфильтровал список, чтобы показывать только * ColSwitch = True *, прежде чем исполнять этот, я ошибаюсь? – ichihaifu

+0

Вам не нужен фильтр раньше. Добавьте свое условие в предложение ON вместе с исключением исключений, которые вы не хотите вставлять в предложение WHEN NOT MATCHED. –

+0

К сожалению, это не работает: «Действие типа« WHEN MATCHED »не может появляться более одного раза в предложении« ОБНОВЛЕНИЕ »инструкции MERGE». Я пробовал искать способы вставить ИЛИ в КОГДА ТОГО, ЧТО-НИБУДЬ, но он, похоже, не работает так, как это применимо для моей ситуации. – ichihaifu

Смежные вопросы