обновить одну таблицу, используя данные из другой таблицы - PullRequest
0 голосов
/ 15 июля 2010

Я пытаюсь обновить свою текущую таблицу, используя данные из другой таблицы. Моя база данных (dbo_finance) колонка - тест

Другая база данных - assestsc, и я собираюсь извлечь данные из столбца issename1, Тем не менее, я хочу вытащить IssueName1, когда поле [MinSecClass] = 9. Это то, что я написал

UPDATE dbo_finance 
SET [dbo_finance].cusip9 = AssetsC.cusip
FROM dbo_finance INNER JOIN AssetsC ON dbo_finance.test = AssetsC.[IssueName1]
WHERE (AssetsC.MinSecClass = 9)

Спасибо, впервые действительно использую SQL

Ответы [ 3 ]

2 голосов
/ 15 июля 2010

Ну, я бы использовал псевдонимы, это хорошая привычка:

UPDATE f
SET [dbo_finance].cusip9 = AssetsC.cusip 
FROM dbo_finance f 
INNER JOIN AssetsC a ON f.test = a.[IssueName1] 
WHERE (a.MinSecClass = 9) 

Теперь это будет работать нормально, если таблица ресурсов будет возвращать только одно значение cuspid для каждой записи.Если это отношения один-ко-многим, вам, возможно, придется усложниться, чтобы действительно получить нужный ответ.

Я вижу несколько серьезных конструктивных недостатков в структуре вашей таблицы.Сначала объединяются поля, которые зависят от чего-то столь же нестабильного, как имя проблемы, и это очень плохой выбор.Вы хотите, чтобы поля PK и FK оставались неизменными.Вместо этого используйте суррогатные ключи и уникальный индекс.

Тот факт, что у вас есть поле с именем cusp9, указывает мне, что вы денормализуете данные.Вам действительно нужно это сделать?Понимаете ли вы, что это обновление должно запускаться в триггере каждый раз, когда куспид ассоциируется с изменениями MinSecClass?Кого ты денормируешь?Есть ли у вас проблемы с производительностью?Такая денормализованная таблица может быть намного сложнее запрашивать, когда вам нужны данные из нескольких из этих пронумерованных полей.Поскольку у вас уже есть данные в таблице активов, что вы получаете, кроме кошмара обслуживания, дублируя их?

1 голос
/ 15 июля 2010
UPDATE dbo_finance
   SET cusip9 = (
                 SELECT A1.cusip
                   FROM AssetsC AS A1 
                  WHERE dbo_finance.test = A1.IssueName1
                        AND AssetsC.MinSecClass = 9
                )
 WHERE EXISTS (
               SELECT *
                 FROM AssetsC AS A1 
                WHERE dbo_finance.test = A1.IssueName1
                      AND A1.MinSecClass = 9
              );
0 голосов
/ 16 июля 2010

Поскольку вы используете SQL 2008, вы можете воспользоваться новым (ish) оператором MERGE.

MERGE INTO dbo_finance
USING (SELECT IssueName1, cusip FROM AssetsC WHERE MinSecClass = 9) AS source 
ON dbo_finance.test = source.IssueName1
WHEN MATCHED THEN UPDATE SET dbo_finance.cusip9 = source.cusip;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...