Мне кажется, что это довольно простой вложенный запрос, но, очевидно, я кое-что упускаю полностью.
НАСТРОЙКА:
У меня есть две таблицы ccod
и psc
.
psc
имеет столбец company_number
, с которым я хочу сопоставить
ccod.company_number_1
или ccod.company_number_2
.
учитывая, что таблицы довольно большие, я использую некоторые предварительные знания, чтобы уменьшить количество сопоставляемых номеров компаний:
номера компаний не может быть пустым
номера компаний должны быть длиной 8 символов
psc.company_number
чистые и содержат только строки длиной 8 символов.
ccod.company_number_1
или ccod.company_number_2
содержит много мусора.
ccod.company_number_1
или ccod.company_number_2
оба могут быть нулевыми, оба содержат строку или содержат одну.
Мне сейчас нет дела до дубликатов.
Плюс
- Используйте
UNION ALL
, чтобы создать 1 отдельный столбец в результате объединения двух столбцов ccod
- присвоить ему значение stacked_company_numbers
.
так:
SELECT *
INTO ccod_psc
FROM psc
WHERE (SELECT DISTINCT psc.company_number)
in
(SELECT DISTINCT stacked_company_numbers
FROM (SELECT company_number_1
FROM ccod
WHERE company_number_1 is not null
UNION ALL
SELECT company_number_2
FROM ccod
WHERE company_number_2 is not null) AS stacked_company_numbers
WHERE char_length(stacked_company_numbers::text) = 8);
[42883] ERROR: operator does not exist: text = record
Hint: No operator matches the given name and argument types. You might need to add explicit type casts.
Position: 86
Теперь слова об этой ошибке довольно понятны, но я понятия не имею, как ее исправить, и попробовал Много других ответов, связанных с ошибкой 42883, но безуспешно.
Спасибо за любую помощь.
- РЕДАКТИРОВАТЬ:
Я также нашел способ заставить мой запрос работать:
SELECT *
INTO ccod_psc
FROM psc
WHERE (SELECT DISTINCT psc.company_number)
in
(SELECT company_number_1
FROM ccod
WHERE company_number_1 is not null
UNION -- this takes cares of the duplicates.
SELECT company_number_2
FROM ccod
WHERE company_number_2 is not null) AS stacked_company_numbers
WHERE char_length(stacked_company_numbers::text) = 8)