У меня есть таблица TableA, например:

ID Group         Type       
1  AB            SomeValue 
2  BC            SomeValue   

Еще одна таблица TableB вроде:

Product Subgroup             Type
A       XX-AB-XX-text        SomeValue
B       XX-BC-XY-text        SomeValue

Я использую INNER JOIN между двумя таблицами, например:

SELECT DISTINCT ID
FROM TableA TA
INNER JOIN TableB TB
ON TA.Type=TB.Type

Я хочу добавить еще одно условие для соединения, которое ищет значение «Группа» в «Подгруппе» и присоединяется только в том случае, если значение «Группа» совпадает после «XX-» и до «-XX».

Другими словами, присоединяйтесь только в том случае, если группа «AB» отображается в правильном месте в столбце «Подгруппа».

Как я могу этого добиться? Я использую MSSQL

0
Thelonious Monk 26 Ноя 2021 в 22:43
1
Разве этот запрос не вызывает синтаксическую ошибку?
 – 
jarlh
26 Ноя 2021 в 22:46
DISTINCT - это не функция, это квантификатор набора - он принадлежит SELECT. Пропустите эти лишние скобки и просто сделайте SELECT DISTINCT ID FROM TableA ....
 – 
jarlh
26 Ноя 2021 в 23:09

2 ответа

Лучший ответ

Попробуй это:

SELECT (DISTINCT ID) 
FROM TableA TA
INNER JOIN TableB TB
ON TA.Type=TB.Type AND TB.SubGroup LIKE '__-' + TA.Group + '%'
1
James Anderbard 26 Ноя 2021 в 22:48
Возможно, я неправильно понял вопрос. Ничего не совпадет? Я думал, что он хотел сопоставить ТОЛЬКО XX- и -XX, и это выражение не решает -XX часть проблемы.
 – 
Chris Strickland
26 Ноя 2021 в 23:04
Разве этот запрос не вызывает синтаксическую ошибку?!?
 – 
jarlh
26 Ноя 2021 в 23:07
1
Плакат искал эту позицию для соответствия, но я думаю, что не обязательно, чтобы у него были крестики до и после IE. Я принял их как значения-заполнители, а не обязательно фактические значения, которые будут там.
 – 
James Anderbard
26 Ноя 2021 в 23:08
Как вы думаете, какая его часть вызовет ошибку? У меня нет копии SQL Server, поэтому мне не удалось протестировать исходный запрос.
 – 
James Anderbard
26 Ноя 2021 в 23:10
1
Кстати, вы можете попробовать свои запросы здесь: dbfiddle.uk/?rdbms=sqlserver_2019
 – 
jarlh
26 Ноя 2021 в 23:12

Вы можете использовать LIKE с CONCAT для построения выражения, см. Эту скрипку:

https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=d7bb4781488e53c31abce0f38d0aaef4

SELECT *
FROM TableA TA
JOIN TableB TB on (
  TA.types = TB.types AND
  TB.subgroup LIKE concat('XX-', TA.groups, '-XX%')
);

Я сбрасываю все возвращенные данные, чтобы вы могли их видеть, но вы бы хотели изменить это, чтобы возвращать только DISTINCT TA.id.

Можно построить выражение, используя + вместо CONCAT:

'XX-' + TA.groups + '-XX%'

Кроме того, я настоятельно рекомендую вам не использовать имена столбцов, которые являются зарезервированными словами. И GROUP, и TYPE используются механизмом SQL, поэтому для их использования вам придется каждый раз избегать их, и они также могут вызвать путаницу у любого, кто читает или поддерживает ваш код.

1
Chris Strickland 26 Ноя 2021 в 22:59