2015-10-06 4 views
1

У меня есть две таблицы, одна из которых имеет 2-значный customerId целочисленный столбец и другой, который имеет целочисленный столбец transactionId. Вторая и третья цифры столбца transactionId соответствуют customerId с. Я хотел бы выполнить объединение в двух таблицах с помощью «соответствия» transactionId и customerId в качестве условия соединения. Что-то вродеСинтаксис соединения условия для сравнения последовательности цифр

customerId LIKE '_transactionId%

Возможно ли это?

+0

Какие типы данных являются этими полями? Является ли ваше использование 'LIKE' подразумевающим, что это фактически поля VARCHAR, которые просто содержат целые числа? Или это действительно тип данных INT? Должно быть, это нужно быть быстрым, или это просто одноразовый, который может быть медленным, но простым для кодирования? Можете ли вы вообще изменить схему? * (В вашем описании подразумевается, что должен быть составной ключ, состоящий как минимум из двух полей, а не одно поле, содержащее несколько значений, зажатых вместе) * – MatBailie

+0

Они целые, но могут быть изменены как VARCHAR. Будет ли создание таблицы с ними, как VARCHAR, повысить эффективность? То есть, это случай типов данных INT в типах VARCHAR, когда мы используем LIKE? – kevin

+1

В этом конкретном случае вы, скорее всего, увидите преимущество использования VARCHAR вместо INT. Это происходит потому, что они действительно должны быть неявно принуждены к VARCHAR, чтобы заставить оператора LIKE действовать на них, и это принуждение запрещает ядро ​​базы данных использовать любые индексы. Если они/были VARCHAR, тогда у вас может быть что-то вроде 'transactionId IN (CONCAT ('0', customerId), CONCAT ('1', customerId), CONCAT ('2', customerId), ... CONCAT ('9 ', customerId)). Но это оптимизация для слабого шаблона проектирования. – MatBailie

ответ

3

Вы имеете право идея:

on transactionId like concat('_', customerId, %) 

В качестве альтернативы можно использовать substr():

on customerId = substr(transactionId, 2, 2) 

Однако, вероятно, вы должны исправить вашу структуру данных, поэтому операции имеют явный столбец для клиента Я бы. Это поможет ускорить соединение. И когда вы начнете получать более 99 клиентов, ваша структура данных будет адаптирована.

+0

Если бы я мог, голосовал бы дважды; ответ, чем помогает, и советы о том, что дизайн имеет недостатки и как их решать. – MatBailie

+1

Я думаю, что это должно быть отменено: 'on transactionId like concat ('_', customerId, '%')' – valex

+0

@valex. , , Спасибо. В любом случае, я предпочитаю вторую формулировку. –

Смежные вопросы