2015-11-27 3 views
0

У меня есть две таблицы: table1 и table2. В обеих таблицах распространено msg_id.SQL-запрос для поиска не дублируемых значений в двух таблицах?

Я написал следующий запрос:

select alert.MSG_ID, alert.ACTION, 
     alert.ALERT_ID, alert.CONTACT_DETAIL, 
     alert.TRXREFNUMBER, alert.TARGET_SYSTEM, 
     log.MSG_ID, log.ACTION, log.ERR_CODE, log.CONTACT_DETAIL 
from bnea.table1 alert, 
    bnea.table2 log 
where not exists (select a.MSG_ID 
        from bnea.table2 
        where alert.MSG_ID = log.MSG_ID); 

Однако он не работает. Когда я выполняю вышеуказанный запрос, он пересекает все записи.

У кого-нибудь есть опыт работы с подобным запросом или похожим?

+0

Вы можете использовать DISTINCT –

+0

взглянуть на http://stackoverflow.com/questions/10377418/need-to-select-the-non-duplicate-values-from-two-table-columns, надежда это поможет –

+0

, где не существует !! эта часть вашего запроса может быть причиной сбоя. i thinck лучше u shoud сделать это: где MSG_ID не существует .... – amir2h

ответ

0

Вы можете использовать этот формат запроса для получения результата без какого-либо повторяющегося результата.

SELECT DISTINCT column1, column2,.....columnN 
FROM table_name 
WHERE [condition] 
0

Вы включили перекрестное соединение (случайно), исходный запрос (переформатировать):

SELECT 
     alert.MSG_ID 
    , alert.ACTION 
    , alert.ALERT_ID 
    , alert.CONTACT_DETAIL 
    , alert.TRXREFNUMBER 
    , alert.TARGET_SYSTEM 
    , log.MSG_ID 
    , log.ACTION 
    , log.ERR_CODE 
    , log.CONTACT_DETAIL 
FROM bnea.table1 alert 
    , bnea.table2 log  --<<<<< this is a cross join !!! 
WHERE NOT EXISTS (
      SELECT 
        a.MSG_ID 
      FROM bnea.table2 
      WHERE alert.MSG_ID = log.MSG_ID 
    ); 

Должно быть:

SELECT 
     alert.MSG_ID 
    , alert.ACTION 
    , alert.ALERT_ID 
    , alert.CONTACT_DETAIL 
    , alert.TRXREFNUMBER 
    , alert.TARGET_SYSTEM 
FROM bnea.table1 alert 
WHERE NOT EXISTS (
      SELECT NULL 
      FROM bnea.table2 log 
      WHERE alert.MSG_ID = log.MSG_ID 
    ); 

Примечания:

  1. Не используйте запятые для разделения таблиц в предложении FROM, это t rick заставляет вас думать о необходимых вам объединениях и ВСЕГДА использовать синтаксис ANSI для объединений.
  2. Нет необходимости возвращать столбец для состояния EXISTS. Некоторые используют SELECT NULL, другие предпочитают SELECT 1 или SELECT *. Я пользуюсь SELECT NULL
+0

Да, я удалил эти столбцы - спасибо –

0

используя ПОЛНУЮ ВНЕШНУЮ СОЕДИНЕННУЮ, как следует?

SELECT 
     alert.MSG_ID 
    , alert.ACTION 
    , alert.ALERT_ID 
    , alert.CONTACT_DETAIL 
    , alert.TRXREFNUMBER 
    , alert.TARGET_SYSTEM 
    , log.MSG_ID 
    , log.ACTION 
    , log.ERR_CODE 
    , log.CONTACT_DETAIL 
FROM bnea.table1 alert FULL OUTER JOIN bnea.table2 log ON(alert.MSG_ID = log.MSG_ID) 
WHERE log.MSG_ID <> alert.MSG_ID 
Смежные вопросы