Oracle SQL选择唯一值AND只匹配具有非唯一值的行的一个值

时间:2015-05-08 13:13:12

标签: sql oracle

我有两个表,一个主表和一个通用信息表。我需要从常规表更新我的主表。当常规信息表的描述值略有不同时,如何更新主表?

+------+---------+
| Code |  Desc   |
+------+---------+
|  156 | Milk    |
|  122 | Eggs    |
|  123 | Diapers |
+------+---------+

信息

+------+---------------+--------+
| Code |     Desc      | Price  |
+------+---------------+--------+
|  156 | Milk          | $3.00  |
|  122 | Eggs          | $2.00  |
|  123 | Diapers       | $15.00 |
|  124 | Shopright Cola| $2.00  |
|  124 | SR Cola       | $2.00  |
+------+---------------+--------+

如您所见,项目124有2个描述。无论哪种描述都无关紧要。

我的尝试是使用两个代码返回124,我理解我的代码正在查找主文件中的唯一代码和描述,这就是为什么它返回124但我不确定如何修复它。

INSERT INTO MASTER
(
SELECT UNIQUE(Code), Desc FROM INFO A
WHERE NOT EXISTS
   (SELECT Code FROM MASTER B
   WHERE A.Code = B.Code )
);

我也尝试过:

INSERT INTO MASTER
(
SELECT UNIQUE(PROC_CDE), Desc FROM FIR_CLAIM_DETAIL A
WHERE Code NOT IN
    (SELECT Code FROM FIR_CODE_PROC_CDE_MSTR B
    WHERE A.Code = B.Code )
);

1 个答案:

答案 0 :(得分:1)

独特过滤所有列中SELECTed结果集中的重复条目,而不仅仅是一个键。

如果要提取已过滤的密钥的其他属性,则必须指示数据库首先对唯一密钥进行分组。要选择分组键的属性之一,我们可以使用AGGREGATE函数。与MAX()MIN()一样。

INSERT INTO MASTER
(
SELECT PROC_CDE, MAX(Desc) FROM FIR_CLAIM_DETAIL A
WHERE Code NOT IN
    (SELECT Code FROM FIR_CODE_PROC_CDE_MSTR B
    WHERE A.Code = B.Code )
GROUP BY PROC_CDE
);

analytical functions可以用于复杂的要求。