Вот правило:
При сравнении userId ищите только userId, начинающийся с "AB" и его совпадающих дубликатов (кроме "AB"). Затем получите список "уникальных идентификаторов пользователя", вернув только дублированный идентификатор пользователя, в начале которого стоит "AB".
Для возвращенной дублированной строки, начинающейся с 'AB', мы должны убедиться, что есть "duplicate"; в противном случае мы не должны возвращать 0 записей
Я знаю, это звучит странно, см. Пример ниже:
Таблица UserName с десятью записями и ее полями userId (10 записей):
ABC1234
C1234
C12345
BC12345
BBC1234
ABF1235
F1235
ABY1236
BCD3456
D3456
Желаемый результат после выполнения запроса:
ABC1234
ABF1235
Обратите внимание: хотя ABY1236 начинается с 'AB', эта запись не должна возвращаться при выводе, так как она не имеет "двойного" соответствия, как Y1236 (игнорируя первые два символа, "AB").
У меня есть пример запроса ниже, но он вернул только дублированную запись, НЕ начинающуюся с 'AB', также он вернет ABY1236.
SELECT distinct substr(userId , -(length(userID)-2))
from UserName where userId like 'AB%';
Спасибо за помощь!
Вы можете использовать EXISTS, чтобы проверить, существует ли userId, равный правой части "AB..", начиная с 3d char:
select u.userId from UserName u
where
u.userId like 'AB_%'
and
exists (
select 1 from UserName where userId = substr(u.userId, 3)
)
Вы можете попробовать использовать выборочное соединение для проверки только совпадения результатов.
SELECT substr(a.userId , -(length(a.userID)-2))
from UserName a
INNER JOIN UserName b ON a.substr(a.userId , -(length(a.userID)-2)) = b.UserId
AND userId like 'AB%'
Попробуйте что-то подобное:
SELECT * FROM
(SELECT userId, count(*) as c from UserName where userId like 'AB%'
GROUP BY substr(userId , -(length(userID)-2))) as t1
WHERE t1.c > 1;