2014-12-06 4 views
1

Я работаю над Oracle 11g db. У меня есть таблица валют, для которой у меня есть 182 записи в 2013 году и в 2014 году у меня есть 81 запись. Я должен получить разницу в 101 запись с 2013 года. Записи о потерях/различиях я должен вставить в 2014 году.Минус-запрос/оператор в Oracle

Интересно, неверен ли мой синтаксис или какой-либо другой метод для генерации запроса на разницу.

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

В чем разница между YEARNR и YEAR_NR? – Multisync

+0

Что произошло, когда вы выполнили запрос? Не дал ли вам желаемый результат? –

+0

@Multisync, YEARNR и YEAR_NR - моя ошибка. Это должен быть YEARNR. – wasabi

ответ

0
SELECT CCYCD 
    , YEARNR 
    FROM CCYEXC 
WHERE YEAR_NR = 2014 
    AND CCYCD,YEARNR NOT IN 
      (
     SELECT CCYCD 
      , YEARNR 
     FROM CCYEXC 
     WHERE YEAR_NR = 2013 
      ); 
+0

Я думаю, вы забыли скобки – Multisync

+0

Спасибо за помощь! – wasabi

+0

Прошу прощения, Синтаксис не работает. Ошибка как неверный реляционный оператор. – wasabi

0

Ваше использование MINUS правильно. Когда вы хотите разницу SET, MINUS - это правильный путь. Обратите внимание, что некоторые другие базы данных используют ключевое слово EXCEPT для этой операции.

Доступны следующие операции с набором.

  • UNION (ВСЕ)
  • INTERSECT
  • МИНУС/КРОМЕ
+0

Что значит «другие» базы данных?OP говорит: oracle11g – tvCa

+0

Использование MINUS может быть неправильным, так как оно также исключает дубликаты в результирующем наборе – Multisync

+0

Предполагается. Это операция SET. SET не содержит дубликатов –

0

Вам только нужно иметь CCYCD столбец в списке SELECT в MINUS запросе. Теперь, чтобы вставить этот результат в таблице в 2014 году, просто написать заявление, я SERT, как это,

INSERT INTO ccyexc SELECT ccycd, 2014 as "yearnr" FROM( <your MINUS query> );

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

МИНУС не работает, потому что оба набора (подзапросы) имеют разные YEARNR (они не пересекаются)

+0

Нет, MINUS будет работать. Не помещайте столбец года в список выбора, поскольку бессмысленно иметь разные годы, которые никогда не пересекаются. Посмотрите на мой ответ. –

+0

@Lalit Kumar MINUS из вопрос не работает. Конечно, в разных случаях его можно использовать. Я только указал, где проблема была – Multisync

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; 

Или, как предложили другие, a NOT EXISTS10 или NOT IN.

Смежные вопросы