#sql
#sql
Вопрос:
У меня есть две таблицы, и я хочу получить технологию_тег из таблицы b на основе идентификатора ссылки из таблицы a:
select b.dbid, b.technology_tag
from tblConnect a, tblSites b
where a.Site_DBID = 2
and a.Related_Site_DBID = 1
and (b.dbid = a.bsc_tag_dbid or b.dbid = a.related_bsc_dbid or b.dbid = a.related_msc_dbid)
Что я хочу иметь здесь, так это упорядочить возвращаемые строки на основе первого появления (в предложении where)
1st- b.dbid = a.bsc_tag_dbid
2cnd- b.dbid = a.related_bsc_dbid
3rd- b.dbid = a.related_msc_dbid
Кто-нибудь имеет представление, как это сделать?
Комментарии:
1. Я отформатировал ваш код, так что есть шанс, что другие смогут его прочитать. В будущем вам следует делать это самостоятельно — используйте кнопку code
{}
для разметки кода, но также старайтесь, чтобы в одной строке отображалось не слишком много. Формат, подобный приведенному выше (это не единственный возможный способ сделать это), упрощает для всех (включая вас через 6 месяцев) поиск отдельных предложений запроса.
Ответ №1:
Во-первых, вы должны переключиться на использование фактических предложений JOIN при выполнении соединений. Тем не менее, это предложение ORDER BY должно делать то, что вы хотите:
SELECT
B.dbid,
B.technology_tag
FROM tblConnect A
INNER JOIN tblSites B ON
B.dbid IN (A.bsc_tag_dbid, A.related_bsc_dbid, A.related_msc_dbid)
WHERE
A.Site_DBID = 2 AND
A.Related_Site_DBID = 1
ORDER BY
CASE
WHEN B.dbid = A.bsc_tag_dbid THEN 1
WHEN B.dbid = A.related_bsc_dbid THEN 2
WHEN B.dbid = A.related_msc_dbid THEN 3
ELSE 4 -- Not really necessary, but I always use an ELSE when I use CASE
END
Комментарии:
1. но запрос теперь требует много времени для извлечения записей, у вас есть какие-либо идеи?
2. Во-первых, я бы изменил запрос, чтобы использовать правильный синтаксис соединения. Затем убедитесь, что ваши таблицы правильно проиндексированы. В зависимости от конкретной используемой вами RDBMS, она может включать инструменты для анализа вашего запроса, чтобы определить, где он занимает больше всего времени. Вы также можете изменить операторы OR на один оператор IN:
B.dbid IN (A.bsc_tag_dbid, A.related_bsc_dbid, A.related_msc_dbid)
3. вы правы (я забыл указать индекс в этой таблице A), еще раз спасибо > последний вопрос: вы говорили о синтаксисе СОЕДИНЕНИЯ: не могли бы вы, пожалуйста, перефразировать запрос who, чтобы увидеть, как это должно выглядеть при использовании JOIN
4. Я отредактировал свой ответ, чтобы включить полный запрос с синтаксисом объединения