2016-08-06 5 views
1

Я запустил инструментальную комнату, где мы используем базу данных для отслеживания наших инструментов. Элементы могут быть вложены под другие элементы, введя ItemID «родительского» инструмента в столбце «ParentID». Например, ключ находится внутри ящика для инструментов, поэтому ItemID ящика для инструментов (2) вводится в поле ParentID для ключа. Ниже приведен пример таблицы:Обновление поля с данными с другого ключа

ItemID BarcodeID Name  ParentId UserTxtBox 
1  0001  Wrench 2   null 
2  box1  Tool Box null  null 
3  0002  Socket 4   null 
4  box2  Tool Box null  null 

Я пытаюсь установить значение UsrTxtBox к BarcodeID из его родительский элемент, как показано здесь:

ItemID BarcodeID Name  ParentId UserTxtBox 
1  0001  Wrench 2   box1 
2  box1  Tool Box null  null 
3  0002  Socket 4   box2 
4  box2  Tool Box null  null 

Запрос, который я придумал с, но не работает:

DECLARE @parentid int 
SET @parentid = null 

UPDATE dbo.items 
SET @parentid = ParentId 
    ,UserTxtBox = (SELECT BarcodeId FROM dbo.items WHERE ItemId = @parentID) 

Запрос выполняется без ошибок, но не вносит никаких изменений. В ходе моих экспериментов, если я заменяю «2» для @parentid в предложении where, он «работает», но, конечно, это сделает UserTxtBox = box1 для каждого элемента в таблице. Если вместо этого я устанавливаю @parentid = 2 и оставляю имя переменной в предложении where, оно все равно не работает. Я проверил, что значение ParentId хранится в @parentid, но когда я использую переменную в предложении where, она не работает. Почему нет?

ItemID - это первичный ключ, а ParentID - это внешний ключ. Являются ли ключи обработаны по-разному от простых целых чисел в этих утверждениях?

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

ответ

1

Как насчет update с join:

update i 
    set UserTxtBox = p.BarcodeID 
    from dbo.items i join 
     dbo.items p 
     on i.ParentId = p.ItemId; 
+0

Вау, это было быстро. Спасибо, Гордон, это работает. Я еще не научился использовать соединение, но когда я наткнулся на него, меня отвлекло его описание, используя две таблицы, в которых я работаю только с одним. На данный момент я не могу полностью окунуться в то, как это работает, но я буду продолжать. –

+0

Чтобы получить представление о том, что происходит, вы можете сделать 'select i. *, P. *', За которым следует предложение 'from'. «Join» также ищет родительский идентификатор и фильтрацию (если нет совпадения, то строка в 'i' не возвращается). –