Исправлено: + 3 на 2-м хариндексе был неверным (чертовски скопировать и вставить)
SELECT st.last, st.first, ct.Document, ct.PageCount, ct.Date, ct.DeviceID
FROM printer_stats.Counts ct
RIGHT JOIN dv.staff st on
substring(st.username,
charindex('cn=',st.username,1)+3,
charindex(',ou=',st.username,1)-charindex('cn='st.username,1)) = ct.username
WHERE ct.DATE >= "2011-10-30" and ct.DeviceID >0
ORDER BY ct.DeviceID, st.last, st.first
Предполагается, что CN = обозначает начало ученика
Предполагается, что ou = всегда будет следовать ID пользователя
Мне нужно сделать это в ORACLE и перевести на SQL-сервер, но вот код в Oracle, который, как я знаю, работает: D
Выберите substr ('cn = trwal141, ou = студентов, ou = cs, o = dvusd',
Instr ( 'сп = trwal141, НУ = студенты, НУ = Cs, о = dvusd', 'сп =', 1) +3,
instr ('cn = trwal141, ou = студенты, ou = cs, o = dvusd' ', ou =', 1) -
Instr ( 'сп = trwal141, НУ = студенты, НУ = Cs, о = dvusd', 'сп =', 1))
ОТ ДВОЙНОГО;
oracle substr = SQL 2008 SUBSTRING
oracle instr = SQl 2008 charindex
Что в основном делает вышеупомянутое:
разбирает "поле st.username", находит первый экземпляр cn = и первый экземпляр, ou =, получает символы между ними и обрабатывает их как критерии соединения
С точки зрения производительности, вы действительно должны разделять данные; даже если это процедура, которую вы запускаете, чтобы заполнить временную таблицу, прежде чем начинать этот тип запроса.