Как выбрать два значения в одном ряду? - PullRequest
1 голос
/ 28 февраля 2020

Кажется чрезвычайно простым c, но я не могу найти элегантное решение для этого. У меня есть две таблицы SQL, одна из которых содержит пользователей, а другая - города. Третья таблица содержит совпадения между двумя предыдущими таблицами (с двумя внешними ключами, указывающими на PK каждой таблицы).

Я хочу добавить элемент в эту третью таблицу, чтобы сказать, что пользователь Джефф живет в Бостон, Массачусетс.

Прямо сейчас, это то, что я делаю:

INSERT INTO users_countries
SELECT user_id, city_id FROM
(
    SELECT TOP 1 user_id
    FROM users
    WHERE name = 'Jeff' AND ...
) a JOIN
(
    SELECT TOP 1 city_id
    FROM cities
    WHERE name = 'Boston' AND ...
) b ON 1 = 1;

Хотя это делает работу, это вовсе не выглядит элегантно.

Что будет лучший способ написать этот запрос?

Ответы [ 2 ]

2 голосов
/ 28 февраля 2020

Я думаю, что более типичным методом будет:

INSERT INTO users_countries (user_id, city_id)
    SELECT user_id, city_id
    FROM users u JOIN
         cities c
         ON u.name = 'Jeff' AND 
            c.name = 'Boston' ;

Это не должно возвращать дубликаты. Но если вы хотите обеспечить одну строку, то используйте SELECT TOP (1) в SELECT.

1 голос
/ 28 февраля 2020

Не объединяйте 2 несвязанные таблицы. Вы хотите добавить новую строку в таблицу, которая состоит из 2 совершенно не связанных значений . Вы ищете элегантность там, где вы должны искать эффективность в первую очередь. Почему вы используете соединение? Даже тогда, почему объединение INNER, когда объединение CROSS обходится без установки каких-либо условий? Я бы использовал VALUES, а не SELECT и совершенно ненужный JOIN:

INSERT INTO users_countries(user_id, city_id) VALUES
(
  (
    SELECT TOP 1 user_id FROM users
    WHERE name = 'Jeff' AND ...
  ),
  (
    SELECT TOP 1 city_id FROM cities
    WHERE name = 'Boston' AND ...
  )
);

См. Упрощенную демоверсию .

...