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

INSERT INTO OrderNew (
SalesOrderID,
OrderDate,
DueDate,
ShipDate,
OnlineOrderFlag,
CustomerID,
CreditCardID,
SubTotal,
TaxAmt,
Freight,
TotalDue,
OrderInfo.salesorderdetail,
OrderInfo.orderqty ,
OrderInfo.productid, 
OrderInfo.unitprice,
OrderInfo.unitpricediscount,
OrderInfo.linetotal
)
SELECT h."SalesOrderID" , h."OrderDate", h."DueDate", h."ShipDate", h."OnlineOrderFlag", h."CustomerID", h."CreditCardID", h."SubTotal", h."TaxAmt", h."Freight", h."TotalDue", d."SalesOrderDetailID", d."OrderQty", d."ProductID", d."UnitPrice", d."UnitPriceDiscount", d."LineTotal"
FROM "SalesOrderHeader" h
INNER JOIN "SalesOrderDetail" d ON  d."SalesOrderID" = h."SalesOrderID"
WHERE d."SalesOrderID" = h."SalesOrderID" ;

Это код, который я использую для импорта данных из некоторых других таблиц. Однако я хочу, чтобы последний столбец был похож на вложенную таблицу. Это столы, которыми я хочу быть. Таким образом, для одного идентификатора заказа на продажу из таблицы «SalesOrderHeader» есть пара или более записей с одинаковым идентификатором заказа на продажу в таблице «SalesOrderDetail». Итак, как я могу это сделать? Использование функции?

Я не знаю, понимаю ли я. Но могу дать больше информации.


person Filippos    schedule 18.02.2015    source источник
comment
В Postgres нет такой вещи, как вложенная таблица. Вам нужно будет создать правильное отношение «один ко многим», а затем вставить в каждую таблицу отдельно. Кстати: я бы настоятельно рекомендовал не использовать идентификаторы в кавычках. В долгосрочной перспективе они доставляют гораздо больше проблем, чем они того стоят.   -  person a_horse_with_no_name    schedule 22.02.2015
comment
Есть ли такая команда, как создать тип xyz как таблицу, как в оракуле?   -  person Filippos    schedule 24.02.2015


Ответы (1)


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

CREATE TYPE Shipping AS(OrderDate Date,DueDate Date,ShipDate Date);

CREATE TYPE ordersdetails AS (details text);

Затем вы создаете таблицу.

CREATE TABLE ordernew ( salesorderid serial NOT NULL, shippinginfo shipping, onlineorderflag integer, customerid serial NOT NULL, creditcardid integer, subtotal real, taxamt real, freight real, totaldue real, orderinfo ordersdetails[]);

Что касается данных, вы просто скопируете данные из двух других таблиц, но напишете правильный запрос, чтобы не создавать повторяющиеся записи. Итак, код ниже.

INSERT INTO OrderNew (
SalesOrderID,
OrderDate,
DueDate,
ShipDate,
OnlineOrderFlag,
CustomerID,CreditCardID,
SubTotal,
TaxAmt,
Freight,
TotalDue,
OrderInfo.salesorderdetail,
OrderInfo.orderqty ,
OrderInfo.productid,
OrderInfo.unitprice,
OrderInfo.unitpricediscount,
OrderInfo.linetotal
)
SELECT h."SalesOrderID" , h."OrderDate", h."DueDate", h."ShipDate", h."OnlineOrderFlag",
h."CustomerID", h."CreditCardID", h."SubTotal", h."TaxAmt", h."Freight", h."TotalDue",
d."SalesOrderDetailID", d."OrderQty", d."ProductID", d."UnitPrice", d."UnitPriceDiscount", d."LineTotal"
FROM "SalesOrderHeader" h
INNER JOIN "SalesOrderDetail" d ON d."SalesOrderID" = h."SalesOrderID"
WHERE d."SalesOrderID" = h."SalesOrderID" ;

Чтобы просто просмотреть данные, которые вы недавно вставили, просто выполните следующий запрос:

SELECT orderinfo FROM ordernew;

person Filippos    schedule 13.05.2015