SQL将行插入表中,该表必须具有2个不同的列,但也必须包含一个非不同的列

时间:2013-08-16 19:27:51

标签: sql select insert db2 distinct

我有两个表,promotion tableprize table

CREATE TABLE PRIZE(
     PRIZEID INT NOT NULL PRIMARY KEY,
     COST DOUBLE NOT NULL,
     PRIZENAME VARCHAR(100) NOT NULL,
)

CREATE TABLE PROMOTION (
     PROMOTIONID    INTEGER NOT NULL,
     LEVEL  INTEGER NOT NULL,
     AMOUNT NOT NULL,
     COST   DOUBLE  NOT NULL    DEFAULT 0,
     PRIZENAME  VARCHAR(100)    NOT NULL    DEFAULT ' ',
     PRIZEID    INTEGER
) 

prize table目前为空,我想将promotion table的记录复制到prize table。在这样做时,我只想选择那些在两列prizenamecost中具有唯一值的记录。之后我会从promotion删除这些列。

现在我有以下sql语句

INSERT INTO prize(PRIZEID, COST, PRIZENAME)
SELECT r.PRIZEID, r.COST, r.PRIZENAME 
FROM PROMOTION r;

但这会将所有记录插入prize table。我意识到我可以在select中使用distinct关键字来选择costprizename的唯一实例,但在我的情况下,prizeid将始终是唯一的,因为distinct关键字适用于select子句中的所有列,它不会帮助。

提前致谢!

2 个答案:

答案 0 :(得分:0)

您必须将PRIZEID值替换为新值。因为听起来您目前在PROMOTION

上有重复项

首先将所有不同的PRIZENAMECOST添加到新的PRIZE表中:

INSERT INTO prize(PRIZEID, COST, PRIZENAME)
SELECT DISTINCT (SELECT MAX(PRIZEID)+1 FROM PRIZE), r.COST, r.PRIZENAME 
FROM PROMOTION r;

然后使用新的PROMOTION

更新您的PRIZEID表格
UPDATE PROMOTION R
SET R.PRIZEID = 
   (SELECT P.PRIZEID 
    FROM PRIZE 
    WHERE P.PRIZENAME=R.PRIZENAME
    AND P.COST=R.COST);

然后,我想从那里你可以安全地删除PROMOTION

中的列

答案 1 :(得分:0)

这将获得基于prizename和费用的独特奖品,并获得该组的最低奖金。

INSERT INTO prize(PRIZEID, COST, PRIZENAME)
SELECT MIN(r.PRIZEID), r.COST, r.PRIZENAME 
FROM PROMOTION r
GROUP BY r.COST, r.PRIZENAME
;