Объединить две таблицы по столбцу - PullRequest
0 голосов
/ 29 сентября 2011

должно быть легко: У меня есть две таблицы:

table 1

  ID  NAME   NEWID   
  1   DOG   
  2   CAT   
  3   HORSE


table 2

NAME   ID
DOG    100
CAT    200
Horse  300

Мне нужно, чтобы результат был следующим:

 ID  NAME   NEWID   
  1   DOG   100
  2   CAT   200
  3   HORSE 300

Мои мысли:

Update table1
set NewId = (select ID from table2 where Id =NewID)

там написано: Неверное имя столбца NewId

Ответы [ 3 ]

2 голосов
/ 30 сентября 2011

Поскольку это довольно простой и часто встречающийся вопрос, я предполагаю, что вы новичок в продукте SQL Server с влиянием его версии 2008 R2.

Я рекомендую вам не пытаться писать новый код, используя собственный синтаксис UPDATE..FROM, который, возможно, сохраняется только в продукте , чтобы оставаться совместимым с устаревшим кодом .

Также обратите внимание, что синтаксис UPDATE..FROM может вызвать неожиданное и непредсказуемое поведение. например если ваш table2 содержал вторую строку для HORSE с другим значением ID, например,

CREATE TABLE table1 (ID INTEGER, NAME VARCHAR(10), NEWID INTEGER);
CREATE TABLE table2 (NAME VARCHAR(10), ID INTEGER);

INSERT INTO table1 VALUES (1, 'DOG', NULL), 
                          (2, 'CAT', NULL),
                          (3, 'HORSE', NULL);
INSERT INTO table2 VALUES ('DOG', 100), 
                          ('CAT', 200),
                          ('HORSE', 300),
                          ('HORSE', 400);

Есть два возможных значения для HORSE, 300 и 400. Какой из них будет выбран, это недокументированное поведение и может быть непредсказуемым.

Вместо этого я рекомендую вам использовать синтаксис MERGE, являющийся расширением стандартного SQL, например

MERGE INTO table1
   USING table2 
      ON table1.NAME = table2.NAME
WHEN MATCHED THEN 
   UPDATE
      SET NEWID = table2.ID;

Обратите внимание, что с добавлением строки, как описано выше, синтаксис MERGE вызовет ошибку («Оператор MERGE попытался ОБНОВИТЬ или УДАЛИТЬ одну и ту же строку более одного раза ...»), что более желательно чем молча, используя произвольное и потенциально неправильное значение. Учтите, что если сегодня разработчики SQL Server действительно считают, что поведение UPDATE..FROM желательно, то почему они не заставляют MERGE работать так же?

1 голос
/ 29 сентября 2011

Вид сбивает с толку, так как кажется, что вам нужно будет сопоставить имя, а не идентификатор? Предполагая, что это так:

UPDATE 
   t1 
SET
  t1.NEWID = t2.ID
FROM
  table1 t1
  INNER JOIN table2 AS t2 ON t1.NAME = t2.NAME;
0 голосов
/ 29 сентября 2011

Единственный способ сопоставить их с таблицами - это name, поэтому вам нужно немного подправить UPDATE:

UPDATE table1
   SET NEWID = (
                SELECT ID 
                  FROM table2 
                 WHERE table2.NAME = table1.NAME
               );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...