I ' Не уверен, правильно ли я это сформулировал, но вот моя дилемма. Я унаследовал приложение, которое должно искать компанию, связанную с каждым контактом в списке. В нынешнем виде приложение запрашивает у БД следующее:
SELECT c.name
FROM company c
WHERE c.id = (SELECT u.company_id
FROM user u
WHERE u.login_id = ?);
Проблема в том, что ему нужно искать тысячи пользователей, поэтому выполнение этого запроса по одному действительно неэффективно. Я бы хотел выполнить 1 такой запрос:
SELECT c.name
FROM company c
WHERE c.id = (SELECT u.company_id
FROM user u
WHERE u.login_id IN LIST (?,?,?...));
Но я не знаю, как затем сопоставить список пользователей с резервной копией компании? Как мне заставить его выбрать совпадающий login_id вместе с именем?
ОБНОВЛЕНИЕ: Как применить ответ ниже к более сложному запросу, который извлекает информацию о контракте из другой БД? Текущий полный запрос выглядит следующим образом (он также извлекает несколько строк, по одной для каждого активного уровня контракта. В конце концов, я также хочу, чтобы он объединил их в 1 со списком всех типов контрактов, чтобы затем я мог запустить grep в этом поле для «самого высокого» (если также нет способа выполнить настраиваемую сортировку в SQL и только вернуть первый):
SELECT c.id,
c.name,
cs.id,
cs.name,
csc.contract_type,
csc.contract_status
FROM company c,
company_site cs,
company_site_contract csc
WHERE c.id = cs.company_id
AND cs.id = csq.site_id
AND csc.contract_status = 'ACTIVE'
AND cs.site_id IN (SELECT cs.site_id
FROM user u,
contact c,
company_site cs
WHERE c.id = u.company_id
AND cs.id = c.site_id
AND u.login_id = ?);