2016-12-15 7 views
0

У меня есть что-то вродеПолучить строки с отсутствующим идентификатором в Redshift

id | name 
---|----- 
1 | Sarah 
3 | Pat 
4 | Lea 

Я ищу недостающие строки. Я попытался использовать generate_series и левое соединение, но это не то, что вы не можете сделать в Redshift, потому что generate_series не поддерживается.

Можно ли это сделать без временной таблицы?

EDIT

Наконец сделал with a temporary table (0 до 1_000_000) см ответ.

+0

Вам нужна временная таблица или подзапрос. Потому что вам нужно что-то сказать вам, что такое полный набор, чтобы узнать, чего не хватает. Так что ответ *** НЕТ ***. –

+0

это может помочь http://stackoverflow.com/questions/17282276/using-sql-function-generate-series-in-redshift –

+0

Откуда вы знаете, какая строка «отсутствует»? –

ответ

0

Это, вероятно, не оптимально. Но так я и сделал

-- create temporary table 
CREATE TABLE series (id INT) SORTKEY(id); 

-- insert 0 to 1_000_000 
INSERT INTO series WITH seq_0_9 AS 
(SELECT 0 AS num 
UNION ALL SELECT 1 AS num 
UNION ALL SELECT 2 AS num 
UNION ALL SELECT 3 AS num 
UNION ALL SELECT 4 AS num 
UNION ALL SELECT 5 AS num 
UNION ALL SELECT 6 AS num 
UNION ALL SELECT 7 AS num 
UNION ALL SELECT 8 AS num 
UNION ALL SELECT 9 AS num), 
        seq_0_999 AS 
(SELECT a.num + b.num * 10 + c.num * 100 AS num 
FROM seq_0_9 a, 
    seq_0_9 b, 
    seq_0_9 c) 
SELECT a.num + b.num * 1000 AS num 
FROM seq_0_999 a, 
seq_0_999 b 
ORDER BY num; 

-- Why not 
VACUUM series; 

-- LEFT OUTER JOIN with table inverted and with the interval 
SELECT * 
FROM series 
LEFT OUTER JOIN other_table ON series.id = other_table.id 
WHERE series.id BETWEEN 0 AND 4 
ORDER BY series.id; 
Смежные вопросы