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));

Другие вопросы по тегам