Могу ли я иметь внутренний SELECT внутри SQL UPDATE? - PullRequest
1 голос
/ 22 апреля 2009

У меня есть база данных, где:

Таблица foo имеет столбцы id и name Таблица bar имеет столбцы id и foo_id

У меня есть входящий HTTP-запрос с foo.name, я хочу вставить строку в bar с bar.foo_id, установленным соответствующим образом Так, например:

> SELECT * FROM foo;
id     name
------ -------
1      "Andrey"
(1 row)


> SELECT * FROM bar;
(0 rows)

Учитывая "Andrey", есть ли один запрос, который я могу выполнить, чтобы получить:

> SELECT * FROM bar;
id     foo_id
------ -------
1      1
(1 row)

Я думал так:

> UPDATE bar SET foo_id=(SELECT id FROM foo WHERE foo.name=?)

Но, похоже, это неправильно, поскольку SELECT возвращает наборы, а не значения ...

Ответы [ 4 ]

4 голосов
/ 22 апреля 2009

вы должны сделать

SELECT TOP 1 ID FROM foo where foo.name=?

но кроме этого нет ничего плохого в выполнении выбора в обновлении.

2 голосов
/ 22 апреля 2009

Это будет работать в MS SQL Server, если подзапрос возвращает только одно значение (например, MAX () или TOP 1)

Я не уверен, что этот синтаксис разветвляется в MySQL, но вы можете попробовать это ...

UPDATE
  bar
SET
  bar.foo_id = foo.id
FROM
  bar
INNER JOIN
  foo
    ON foor.name = bar.name
ORDER BY
  foo.id

В этом случае, если объединение возвращает несколько результатов для каждой записи в столбце, все они будут применены. Порядок, определяющий, в каком порядке они применяются, и последний является постоянным.

0 голосов
/ 22 апреля 2009

Попробуйте следующий

ОБНОВЛЕНИЕ БАР SET foo_id = F.id ОТ бара ПРИСОЕДИНЯЙТЕСЬ (ВЫБЕРИТЕ идентификатор из foo, где foo.name = @fooName) F

0 голосов
/ 22 апреля 2009

Это будет работать как минимум на сервере sql и oracle.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...