У меня вопрос, потому что я очень плохо разбираюсь в SQL.Я понимаю основные функции, но когда
становится немного сложнее, я полностью теряюсь.
вот что у меня есть:
таблицы: tA, tB
столбцы: tA: refAtB: refB
в основном refA и refB представляют одно и то же (некоторый идентификатор формы, такой как xxx-xxx-xxx), но к refB может добавляться информация (например, xxx-xxx-xxx_Zxxx или xxx-xxx-xxx Zxxx)
вот что я умею делать:
запрашивать элементы, которые есть в таблице, но не в другой (когда они абсолютно одинаковые)
select refA
from tA
where not exists (select *
from tB
where tB.refB = tA.refA
)
Что яхочу сделать:
Я хочу запрос, который будет перечислять элементы из refA, которые не в refB.НО, проблема в том, что если я выполню «простой» запрос с НЕ СУЩЕСТВУЮЩИМ, как я только что показал, он вернет все из-за добавления.поэтому я подумал об использовании некоторого синтаксиса, подобного этому:
SELECT refA
FROM tA
WHERE NOT EXISTS (SELECT *
FROM tB
WHERE tB.refB LIKE CONCAT(tA.refA,'%'))
, но ... конечно, это не работает.
Может кто-нибудь показать мне, как это должно быть сделано, а такжеобъясните, как это работает, чтобы я мог учиться?
Заранее спасибо!
edit: дополнительная информация
Я не могу использовать left () или что-то подобное, потому чтоформат ref похож, но не всегда одинаков (различается по количеству символов).
Единственный способ определить конец идентификатора перед добавлением - это наличие пробела или подчеркивания.
edit 2: образец данных, вызывающий проблемы (MON, 10 января)
Вот некоторые фактические данные из таблиц, из-за которых большинство ответов, которые люди дали здесь, упускают некоторые результаты:/
в тА:
B20-60-04-6A-1
B20-60-04-6A-11
B20-60-04-6A-12
B20-60-04-6A-13
в тБ:
B20-60-04-6A-11_XX
B20-60-04-6A-12_XX
B20-60-04-6A-13_XX
Проблема с mid (), left () и т. Д. Заключается в том, что еслимы проверяем "B20-60-04-6A-1" (14 символов) против 14 первых символов, он вернет 3 положительных значения, хотя на самом деле его нет в ТБ ...
, так как можномы продолжаем?
Примеры шаблонов данных в ТА следующие:
(X, XYZ: символы. X: буквенно-цифровой)
Xxx-xx-xx-x
Xxx-xx-xx-xx
Ххх-хх-хх-хх-хх
Ххх-хх-хх-хх-хх-х
и т. Д.
примеры шаблонов данных в ТБ:
Ххх-хх-xx-xx-xx-XYZ-xx Z xxx_XX
Xxx-xx-xx-xx-xx-XYZZxxx_XX
Xxx-xx-xx-xx-xx Z xxx_XX
XYZ всегда одинаковы3 персонажа.Когда у нас нет XYZ, всегда есть пробел или подчеркивание.
поэтому строка данных, которую мы сравниваем, должна быть обрезана в соответствии с этим:
- от начала до строки -XYZ
- или, если в строке нет -XYZ, от начала к первой ""или" _ "
Я бы написал молниеносно в VBA, но в SQL ... хорошо, я попробую, но я действительно плох в этом: D