我需要将新项目帐单添加到具有
的帐单表中列表项
也是项目的主键。
这是我的桌子:
CREATE TABLE labourtype (
lkey SERIAL PRIMARY KEY,
ltype VARCHAR(20),
hourwage DECIMAL);
CREATE TABLE project (
pkey SERIAL PRIMARY KEY,
ptype VARCHAR(20),
p_finished DATE,
has_been_paid INT DEFAULT 0);
CREATE TABLE equipment (
ekey SERIAL PRIMARY KEY,
ename VARCHAR(50) NOT NULL UNIQUE,
purchase_price DECIMAL NOT NULL,
in_stock INT DEFAULT 0);
CREATE TABLE labour_in_project (
lkey INT NOT NULL,
pkey INT NOT NULL,
workday DATE DEFAULT CURRENT_DATE,
workhours INT,
discount DECIMAL,
PRIMARY KEY(lkey, pkey, workday),
FOREIGN KEY (lkey) REFERENCES labourtype(lkey),
FOREIGN KEY (pkey) REFERENCES project(pkey));
CREATE TABLE equipments_used(
pkey INT NOT NULL,
ekey INT NOT NULL,
sold DATE DEFAULT CURRENT_DATE,
quantity int,
selling_price DECIMAL,
discount DECIMAL,
PRIMARY KEY(pkey, ekey, sold),
FOREIGN KEY (pkey) REFERENCES project(pkey),
FOREIGN KEY (ekey) REFERENCES equipment(ekey));
CREATE TABLE bill (
bkey SERIAL PRIMARY KEY,
pkey INT NOT NULL,
labour_price DECIMAL,
equipment_price DECIMAL,
FOREIGN KEY (pkey) REFERENCES project(pkey));
以下是艰苦而艰苦的劳动总成本的选择:
SELECT SUM(price) AS workprice
FROM (SELECT labourtype.hourwage * lip.discount * lip.workhours as price
FROM labourtype INNER JOIN labour_in_project AS lip
ON labourtype.lkey = lip.lkey AND pkey = 1) AS priceoflabour;
这是我们设备成本的选择:
SELECT SUM(price) AS equipmentprice
FROM (SELECT eu.quantity * eu.selling_price * eu.discount as price
FROM equipments_used AS eu
WHERE eu.pkey = 1) AS equipment_costs;
现在我需要做的就是在票据表中插入工作价格,设备价格和pkey 1。该怎么做?
答案 0 :(得分:0)
如果只想对pkey 1执行此操作,则解决方案非常明显:
INSERT INTO
bill (pkey, labour_price, equipmentprice)
VALUES
(1,
(SELECT
SUM(llp.price)
FROM
(SELECT
labourtype.hourwage * lip.discount * lip.workhours AS price
FROM
labourtype
INNER JOIN labour_in_project AS lip
ON labourtype.lkey = lip.lkey AND pkey = 1) AS llp),
(SELECT
SUM(ep.price)
FROM
(SELECT
eu.quantity * eu.selling_price * eu.discount AS price
FROM
equipments_used AS eu
WHERE eu.pkey = 1) AS ep));
您可以编写一个以pkey
作为参数的函数,并对给定的pkey
进行上述插入。
您也可以使用INSERT INTO SELECT对所有pkey
执行此操作:
INSERT INTO
bill (pkey, labour_price, equipment_price)
SELECT
p.pkey AS pkey,
(SELECT
SUM(llp.price)
FROM
(SELECT
labourtype.hourwage * lip.discount * lip.workhours AS price
FROM
labourtype
INNER JOIN labour_in_project AS lip
ON labourtype.lkey = lip.lkey AND pkey = p.pkey) AS llp) AS workprice,
(SELECT
SUM(ep.price)
FROM
(SELECT
eu.quantity * eu.selling_price * eu.discount AS price
FROM
equipments_used AS eu
WHERE eu.pkey = p.pkey) AS ep) AS equipmentprice
FROM
project p;