Как объединить несколько динамических запросов - PullRequest
0 голосов
/ 14 января 2019

Я использую node для связи с моей postgresql базой данных.
У меня есть список автомобилей:

[{id:1, areaId: 1}, 
 {id:2, areaId: 2}, 
 {id:3, areaId: 2}]

areaId - это столбец в другой таблице (скажем, areas), и я хочу получить название области для каждого автомобиля:

select name from areas
where id = areaId

Как мне составить список, содержащий все автомобили с указанным названием области?
Наивный подход заключается в query базе данных для каждого объекта:

const query = `select name from areas
                 where id = $1`;
return pg.query(query, car.areaId);

Но, похоже, нужно выполнить много запросов.

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Да, вы можете указать несколько car.id s, получить car.name и area.name и вернуть их вместе.

Далее вы можете отсортировать ответ по car.id, используя ORDER BY. Я не знаю ни одного способа принудительно упорядочить порядок, основанный на порядке передачи в IDS, но вы легко могли бы отсортировать результаты в памяти очень быстро с помощью JavaScript.

Есть несколько способов сделать это в SQL: внутреннее объединение, полное объединение, отбор ... возможно, больше. Я продемонстрирую «внутреннее объединение», поскольку оно обычно наиболее эффективно, и некоторые планировщики SQL-запросов в любом случае преобразуют подвыборы во внутренние объединения.

Вы не указали, но при условии, что вы используете node-postgres ... вот ответ, когда carIds уже определен как массив:

Внутреннее соединение

const query = `SELECT car.id, car.name, areas.name FROM car INNER JOIN area ON car.areaId WHERE car.id = ANY (${carIds}) ORDER BY car.id`

Наконец:

return pq.query(query, carIds)    
0 голосов
/ 15 января 2019

Вы должны иметь возможность выбрать несколько идентификаторов одновременно с этим.

SELECT name
FROM areas
where ID in (5263, 5625, 5628, 5621) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...