2015-04-27 91 views
4

是否有任何可能的方式做這樣的子查詢:四(4)子查詢

DELETE (INSERT (SELECT (INSERT))) 

我懂得:

INSERT INTO r (u_id,role) 
    VALUES ((SELECT u_id FROM USER WHERE email="[email protected]"),'Agent'); 

我的問題是::INSERT (SELECT)
用戶出現在請求表中時,他驗證其帳戶時,系統必須:

  1. 創建用戶in用戶表
  2. 從請求表
+4

爲什麼你不能只是做3個查詢?它肯定會比所有這些子查詢更具可讀性(即使這可能) – DavidG

+1

爲什麼不使用存儲過程作爲接口?然後你可以做所有的檢查,插入/刪除和處理錯誤。 – jpw

+0

謝謝先生。@ DavidG我已經在做這3個查詢 謝謝先生。@ jpw虐待下一次記住程序...我正在做我的最終項目剛開始學習 – Umair

回答

3

你可以做INSERT INTO .... SELECT ...是,SELECT被用作輸入到INSERT查詢原因

  • 刪除用戶創建角色表用戶角色。

    但是,INSERT查詢不會以這種方式返回任何內容。你好得多隻寫3個不同的查詢是這樣的:

    --Create user in user table 
    INSERT INTO UserTable VALUES (...) 
    
    --Create user role in role table 
    INSERT INTO UserRoles VALUES (...) 
    
    --Delete user from request table 
    DELETE FROM Requests WHERE ... 
    

    你甚至可以包所有的交易,以確保所有或沒有查詢的運行:

    BEGIN TRAN 
    
    --Create user in user table 
    INSERT INTO UserTable VALUES (...) 
    
    --Create user role in role table 
    INSERT INTO UserRoles VALUES (...) 
    
    --Delete user from request table 
    DELETE FROM Requests WHERE ... 
    
    COMMIT 
    

    我懷疑也是您想要使用您創建的用戶的ID。要做到這一點,假設你的UserTableIDENTITY列,您可以使用SCOPE_IDENTITY功能:

    BEGIN TRAN 
    
    --Create user in user table 
    INSERT INTO UserTable VALUES (...) 
    
    DECLARE @UserID INT 
    SET @UserID = SCOPE_IDENTITY() 
    
    --Create user role in role table 
    INSERT INTO UserRoles (UserID, RoleID) VALUES (@UserID, ...) 
    
    --Delete user from request table 
    DELETE FROM Requests WHERE ... 
    
    COMMIT 
    
  • +0

    @ user3316447關於你對此建議的編輯答案,我會接受'BEGIN TRAN'被重寫爲'BEGIN TRANSACTION'(儘管我更喜歡較短的一個,因爲它更容易輸入),但是每行末尾的分號在SQL Server中並不需要。 – DavidG