我正在研究Oracle 11g数据库。我有货币表,我在2013年有182条记录,而在2014年,我有81条记录。我必须得到2013年的101条记录。我必须在2014年插入缺失/差异记录。
我想知道我的语法是否不正确或者是否有任何其他方法来生成差异查询。
SELECT
a.CCYCD,
a.YEARNR
FROM CCYEXC a
WHERE a.YEARNR = 2013
minus
SELECT
a.CCYCD,
a.YEARNR
FROM CCYEXC a
WHERE a.YEARNR = 2014;
答案 0 :(得分:0)
SELECT CCYCD
, YEARNR
FROM CCYEXC
WHERE YEAR_NR = 2014
AND CCYCD,YEARNR NOT IN
(
SELECT CCYCD
, YEARNR
FROM CCYEXC
WHERE YEAR_NR = 2013
);
答案 1 :(得分:0)
您对MINUS的使用是正确的。当你想要SET差异时,MINUS是正确的方法。请注意,其他一些数据库使用EXCEPT关键字进行此操作。
以下设定操作可用。
答案 2 :(得分:0)
您只需要在CCYCD
查询的SELECT
列表中包含MINUS
列。现在,要将此结果插入到2014年的表中,只需编写一个这样的i sert语句,
INSERT INTO ccyexc
SELECT ccycd, 2014 as "yearnr"
FROM(
<your MINUS query>
);
答案 3 :(得分:0)
EXISTS通常更快:
SELECT a.CCYCD, a.YEARNR
FROM CCYEXC a
WHERE a.YEARNR = 2013
and not exists (select 1 from CCYEXC b where b.YEARNR = 2014 and b.CCYCD = a.CCYCD);
另一种选择:
SELECT a.CCYCD, a.YEARNR
FROM CCYEXC a
WHERE a.YEARNR = 2013
and a.CCYCD not in (select distinct CCYCD from CCYEXC b where b.YEARNR = 2014);
您也可以使用LEFT JOIN
MINUS无法正常工作,因为两组(子查询)都有不同的YEARNR(它们不相交)
答案 4 :(得分:0)
更简单的方法是使用聚合:
SELECT c.CCYCD,
FROM CCYEXC c
GROUP BY c.CCYCD
HAVING SUM(CASE WHEN c.YEARNR = 2013 THEN 1 ELSE 0 END) > 0 AND
SUM(CASE WHEN c.YEARNR = 2014 THEN 1 ELSE 0 END) = 0;
或者,正如其他人所建议的那样,NOT EXISTS
或NOT IN
条款。