Показать недостающие строки (оракул, sql) - PullRequest
0 голосов
/ 07 ноября 2018

Я запускаю ниже выберите:

select replace(replace(id,'[',''),']','') as ID from tableA where COL1= 'TEST';

Возвращает 15 строк .

example of id:

1abc
3def
9abc
..
..
..
14abc

Тогда я смотрю этот идентификатор в другую таблицу:

select col1, col3 from tableB where 
      id in (select replace(replace(id,'[',''),']','') from tableA where COL1= 'TEST');

Возвращает 12 строк.

1abc   city1
2def   city2
5abc   city2
..     ..
12abc  city3

Как отобразить пропущенные 3 строки?

1 Ответ

0 голосов
/ 07 ноября 2018

Я полагаю, что на самом деле нет пропущенных строк, а скорее, что 3 из 15 строк, возвращаемых первым запросом, на самом деле являются дублирующими id значениями.

Чтобы увидеть, как это может работать, учтите, что первый запрос вернул следующие 5 id значений (для простоты):

1
1
1
2
2

На самом деле существует 5 id значений, но только 2 на самом деле уникальны. Затем следующее WHERE предложение:

WHERE id IN (1, 1, 1, 2, 2)

равносильно тому, чтобы просто сказать:

WHERE id IN (1, 2)

Другая возможность этого может заключаться в том, что tableB просто не содержит все id, возвращаемые первым запросом.

Чтобы найти пропущенные строки, есть один способ:

WITH cte AS (
    SELECT REPLACE(REPLACE(id, '[', ''), ']', '') AS ID
    FROM tableA
    WHERE COL1= 'TEST'
)

SELECT a.ID
FROM cte a
LEFT JOIN tableB b
    ON a.ID = b.ID
WHERE b.ID IS NULL;
...