2017-07-26 60 views
1

更新外鍵要外鍵更新到一個名爲表用戶其中外鍵指項目表,集團表。 用戶屬於一個項目,在一個組內,該組被定義爲項目級別。的詳細的用戶信息也存儲到一個表中ToolUser我如何在單一個語句

在爲用戶創建表語句如下:

CREATE TABLE [dbo].[User](
    [ID] [int] IDENTITY(1,1) NOT NULL, 
    [IDproject] [int] NOT NULL, 
    [IDtoolUser] [int] NOT NULL, 
    [IDgroup] [int] NOT NULL, 
    [datemodified] [datetime] NOT NULL DEFAULT (getdate()) 
  • IDproject是FK爲ID在項目

  • IDtoolUser是FK for ID在ToolUser

  • IDgroup是FK爲ID在組表

我想執行包括在改變所述用戶分配到的組的更新這需要解決項目ID,更新羣組ID之前的羣組ID 用戶

我想出了一個解決方案,其中的組ID是cal culed與函數,[DBO]。[IDofGroup],並用於爲UPDATE語句如下

UPDATE [dbo].[User] 
SET IDgroup = [dbo].[IDofGroup]('TESTPROJ','none') 
FROM [dbo].[User] as u 
    INNER JOIN [dbo].[Group] g 
     ON g.[ID]= u.[IDgroup] 
    INNER JOIN [dbo].[Project] p 
     ON p.[ID]= u.[IDproject] 
     AND p.[name] ='TESTPROJ' 
WHERE g.[name] = 'TESTGROUP' 
GO 

功能IDofGroup本身執行夫婦SELECT解決項目ID和組ID如下

ALTER FUNCTION [dbo].[IDofGroup] 
(
    -- Add the parameters for the function here 
    @ProjectName as varchar(max), 
    @GroupName as varchar(max) 
) 
RETURNS int 
AS 
BEGIN 
    -- Declare the return variable here 
    DECLARE @ProjectID int, @ResultID int 
    SET @ResultID=0 

    -- get project ID for @ProjectName 
    SELECT @ProjectID= ID 
    FROM [dbo].[Project] 
    WHERE [name][email protected] 

    -- find id fro group which name is @GroupName and project ID @ProjectID 
    SELECT @ResultID= ID 
    FROM [dbo].[Group] 
    WHERE [IDproject][email protected] 
    AND [name][email protected] 

    -- Return the result of the function 
    RETURN @ResultID 

END 

餘米想知道是否有任何的方式與某種在一個UPDATE語句中JOIN W/O的需求UPDATE語句

+0

在你當前的'Update'語句中,INNER JOIN'現在可以得到你什麼,而不使用函數?把它變成一個'Select'語句來得到你需要的結果。然後將其重新轉換爲'Update'語句。 –

+0

這是真的,我可以拉出一些功能,並執行之前的幾個SELECT語句。該功能只是方便重複使用。將這些SELECT添加到UPDATE中是我遇到的困難,爲什麼我要問'如何?'似乎增加一個INNER JOIN使它變成 –

回答

2

之前,使用功能IDofGroup或其他SELECT語句的執行更新試試這個:

UPDATE u 
SET IDgroup = g1.[ID] 
FROM [dbo].[User] as u 
    INNER JOIN [dbo].[Project] p 
     ON p.[ID]= u.[IDproject] 
    INNER JOIN [dbo].[Group] g 
     ON g.[ID]= u.[IDgroup] 
    INNER JOIN [dbo].[Group] g1 
     ON g.[IDproject] = g1.[IDproject] 
WHERE p.[name] ='TESTPROJ' 
AND g.[name] = 'TESTGROUP' 
AND g1.[name] = 'none' 
+1

而不是'UPDATE [dbo]。[User]'只需使用'UPDATE u'。 –

+0

是的,謝謝。編輯。 –