sql новичок пытается сопоставить данные в двух таблицах
У меня есть две таблицы, DATA_TABLE
а также ERROR_TABLE
, DATA_TABLE
имеет колонку ID
с 8-значным номером. ERROR_TABLE
имеет колонку KEY
с idkey=
следуют восемь цифр.
Я не могу использовать пересечение, потому что кортежи разные, и я не знаю, как обойти это.
Что мне нужно, это найти строки в DATA_TABLE
которые имеют значение в ID
столбец, который соответствует значению в ERROR_TABLE
в KEY
колонка.
Вот визуальный. Мне нужно увидеть, какие из них совпадают, и отобразить эти строки из DATA_TABLE
DATA_TABLE
ID
24294857
19573859
49205983
ERROR_TABLE
KEY
idkey=24294857
idkey=66849896
idkey=94697356
6 ответов
Я бы использовал простое внутреннее соединение
select *
from DATA_TABLE
inner join ERROR_COLUMN
on DATA_TABLE.ID = ERROR_TABLE.KEY
select dt.*
from data_table dt
join error_table et
on et.idkey = dt.id
Подобно PM 77-1, но с использованием явного соединения:
SELECT *
FROM DATA_TABLE
JOIN ERROR_TABLE
ON 'idkey=' || ID = KEY;
Смотрите: http://sqlfiddle.com/
Лучше всего исправить ваши данные в таблице ошибок. Эти примеры будут вырезать текст, оставляя только цифры. Вы можете явно преобразовать их в число с помощью функции TO_NUMBER(), чтобы присоединиться и сравнить. У вас уже есть много примеров присоединения. Но прежде чем присоединиться, вам нужно преобразовать обе стороны в число, отрезав символы перед числами:
-- This example assumes you will always have '=' in your string --
SELECT SUBSTR('idkey=24294857', INSTR('idkey=24294857', '=')+1) digits_only
FROM dual
/
SELECT regexp_replace('idkey=24294857','[^0-9]') digits_only
FROM dual;
/
SELECT REGEXP_SUBSTR('idkey=24294857','[[:digit:]]+') AS digits_only FROM dual
/
После этого ваш запрос будет сравнивать число с числом в соединении, что является единственно правильным.
Вы имеете в виду что-то подобное?
SELECT * FROM DATA_TABLE d, ERROR_TABLE e
WHERE ('idkey='||d.id = e.key)
ORDER BY DATA_TABLE.id
Спасибо за помощь. Я попробовал предложение, но не смог заставить их работать. Я действительно зеленый с SQL и понимаю только несколько команд.:/ Я получил это от коллеги, и он выполнил то, что мне нужно. теперь мне просто нужно это понять.
SELECT * FROM DATA_TABLE, ГДЕ СУЩЕСТВУЕТ (ВЫБЕРИТЕ NULL ОТ ERROR_TABLE, ГДЕ ID = SUBSTR(ERROR_TABLE.KEY,7));