Разделить строку и вставить в разные таблицы на основе столбца - PullRequest
0 голосов
/ 27 февраля 2020

У меня есть такой стол. Таблица заполняется каждый раз, когда заказ выполнен. В одном заказе может быть одно или несколько отделений.

+---------+-------+-------------+------+
| OrderID | Plant | Compartment | Qty  |
+---------+-------+-------------+------+
|      91 |    12 |           1 | 2000 |
|      91 |    12 |           2 | 2000 |
|      91 |    12 |           3 | 2000 |
|      90 |    12 |           1 | 3000 |
|      89 |    12 |           1 | 5000 |
+---------+-------+-------------+------+

Помогите, пожалуйста, написать скрипт SQL, который берет вышеприведенное и разбивает его на две новые таблицы, например:

Таблица 1

+---------+-------+
| OrderID | Plant |
+---------+-------+
|      91 |    12 |
|      90 |    12 |
|      89 |    12 |
+---------+-------+

Таблица 2

+---------+-------------+------+
| OrderID | Compartment | Qty  |
+---------+-------------+------+
|      91 |           1 | 2000 |
|      91 |           2 | 2000 |
|      91 |           3 | 2000 |
|      90 |           1 | 3000 |
|      89 |           1 | 5000 |
+---------+-------------+------+

Я пытался использовать команду DISTINCT, как предложено;

SELECT * FROM table 
WHERE [OrderID] = (SELECT DISTINCT OrderID from table where (COMPARTMENT = '1'))

, которая возвращает ошибку;

Подзапрос вернул более 1 значение. Это недопустимо, если подзапрос следует =,! =, <, <=,>,> = Или когда подзапрос используется в качестве выражения.

Если скрипт может отслеживать уже обработанные строки, чтобы чтобы избежать дублирования при каждом запуске, это было бы обледенением на торте.

1 Ответ

0 голосов
/ 27 февраля 2020

Вот как я это сделаю:

-- just for debugging, your table is my @table variable table
set nocount on
declare @table table (OrderId int, Plant int, Compartment int, Qty int)

insert into @table values (89, 12, 1, 5000)
insert into @table values (90, 12, 1, 3000)
insert into @table values (91, 12, 3, 2000)
insert into @table values (91, 12, 2, 2000)
insert into @table values (91, 12, 1, 2000)
insert into @table values (91, 12, 2, 3000)

set nocount off 
--select * from @table

-- now here it comes selections:
if (exists (select * 
                 from INFORMATION_SCHEMA.TABLES 
                 where TABLE_SCHEMA = 'dbo' -- or your schema 
                 and TABLE_NAME = 'THeader' -- or your header's table))
    insert into THeader
    select distinct t1.OrderId, t1.Plant 
    from @table t1
    left join THeader t2 on t1.OrderId = t2.OrderId and t1.Plant = t2.Plant
    where t2.OrderId is null
else
    select distinct t1.OrderId, t1.Plant 
    into THeader
    from @table t1
    left join THeader t2 on t1.OrderId = t2.OrderId and t1.Plant = t2.Plant
    where t2.OrderId is null

if (exists (select * 
                 from INFORMATION_SCHEMA.TABLES 
                 where TABLE_SCHEMA = 'dbo' -- or your schema 
                 and TABLE_NAME = 'TChilds' -- or your childs's table))
    insert into TChilds
    select distinct t1.OrderId, t1.Compartment, t1.Qty 
    from @table t1
    left join TChilds t2 on t1.OrderId = t2.OrderId and t1.Compartment = t2.Compartment and t1.Qty = t2.Qty
    where t2.OrderId is null
else
    select distinct t1.OrderId, t1.Compartment, t1.Qty 
    into TChilds
    from @table t1
    left join TChilds t2 on t1.OrderId = t2.OrderId and t1.Compartment = t2.Compartment and t1.Qty = t2.Qty
    where t2.OrderId is null

-- just for debugging
select * from THeader
select * from TChilds

Редактировать: Несмотря на это, я вижу вашу основную таблицу как дочернюю таблицу, откуда вы должны создать таблицу заголовка. Достаточно. Я имею в виду, что ваша таблица может быть моей таблицей TChilds, а ключ может быть OrderId + Plant. (Я не знаю, что означает растение в этой таблице)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...