2017-04-15 36 views
0

他們我有一個表(名爲UserAccess)這樣設計...在表中插入行,以模仿其他行,只有當不存在

[ID], [UserID], [Active] 

我有一個表(名爲UserAccounts)這樣設計...

[UserID], [Password], [Group] 

UserAccess表目前我有以下數據...

1203, 'user1', 1 
1203, 'user2', 1 
1203, 'user4', 1 
1202, 'user1', 1 
1203, 'user8', 1 
1202, 'user6', 1 
1206, 'user2', 1 
1205, 'user2', 1 
1204, 'user1', 1 
1204, 'user6', 1 

UserAccounts表目前我有以下數據...

'user1', 'password', 'group1' 
'user2', 'password', 'group10' 
'user3', 'password', 'group1' 
'user4', 'password', 'group4' 
'user5', 'password', 'group10' 
'user6', 'password', 'group10' 
'user7', 'password', 'group2' 
'user8', 'password', 'group10' 

我想爲屬於「組10」的用戶,讓他們模仿的每一行的「添加新行用戶2'不存在到UserAccess表中。作爲示例,結果應該是...

1203, 'user1', 1 
    1203, 'user2', 1 
    1203, 'user4', 1 
    1202, 'user1', 1 
    1203, 'user8', 1 
    1202, 'user6', 1 
    1206, 'user2', 1 
    1205, 'user2', 1 
    1204, 'user1', 1 
    1205, 'user6', 1 
* 1203, 'user5', 1 
* 1206, 'user5', 1 
* 1205, 'user5', 1 
* 1203, 'user6', 1 
* 1206, 'user6', 1 
* 1206, 'user8', 1 
* 1205, 'user8', 1 

新結果顯示添加的行是在它們前面帶有星號的行。什麼是實現這一目標的最佳方式?我試圖用這樣的東西,但似乎無法得到我以後的結果,老實說,我似乎無法接近我想要的...

注意:@UserId應該改變通過每個用戶。

DECLARE @ModelId varchar(30); SET @ModelId = 'user2'; 
INSERT INTO UserAccess ([ID], [UserID]) 
SELECT [ID], @UserId, FROM UserAccess 
WHERE [UserID] = @ModelId 

謝謝!

+0

我忘了補充,我試着用一些'INNER JOIN'語句也沒有運氣...:/ –

+0

'UserAccess'中的'ID'字段是如何生成的? – toonice

+0

從不同的表格。在另一個名爲'Task'的表中,它會自動生成,並且手動設置幾個字段。但是如果可能的話,我想遠離「那個」表。 –

回答

1

請嘗試以下...

INSERT INTO UserAccess 
SELECT ID, 
     UserID, 
     1 
FROM UserAccounts outerUserAccounts, 
    (SELECT ID 
     FROM UserAccess 
     WHERE UserID = 'user2') AS selectedIDs 
WHERE [Group] = 'Group10' 
    AND NOT EXISTS (SELECT * 
        FROM UserAccess 
        WHERE UserAccess.ID = selectedIDs.ID 
        AND UserAccess.UserID = outerUserAccounts.UserID); 

我開始先用下面的SQL語句識別它的ID值與指定UserID相關(在這種情況下user2)...

SELECT ID 
FROM UserAccess 
WHERE UserID = 'user2' 

然後,我在生成的表(我稱之爲selectedIDs)上創建了CROSS JOIN,以及來自UserAccounts的那些記錄,其中用戶屬於指定d Group(在這種情況下爲Group10)。 (請注意:UserAccounts, selectedIDs相同UserAccounts CROSS JOIN selectedIDs

結果表中包含的IDUserID將需要插入UserAccounts值,但也可能包含已經在UserAccounts存在的記錄。因此,以下WHERE條款加入到SELECT聲明...

NOT EXISTS (SELECT * 
      FROM UserAccess 
      WHERE UserAccess.ID = selectedIDs.ID 
      AND UserAccess.UserID = outerUserAccounts.UserID) 

該條款測試,看是否由主聲明正在考慮的值不UserAccess已經存在。

我的代碼已針對使用以下腳本創建的示例數據庫進行了測試...

CREATE TABLE UserAccess 
(
    ID  INT, 
    UserID VARCHAR(10), 
    Active INT 
); 
CREATE TABLE UserAccounts 
(
    UserID VARCHAR(10), 
    [Password] VARCHAR(10), 
    [Group]  VARCHAR(10) 
); 
INSERT INTO UserAccess (ID, 
         UserID, 
         Active) 
VALUES (1203, 'user1', 1), 
     (1203, 'user2', 1), 
     (1203, 'user4', 1), 
     (1202, 'user1', 1), 
     (1203, 'user8', 1), 
     (1202, 'user6', 1), 
     (1206, 'user2', 1), 
     (1205, 'user2', 1), 
     (1204, 'user1', 1), 
     (1204, 'user6', 1); 
INSERT INTO UserAccounts (UserID, 
          [Password], 
          [Group]) 
VALUES ('user1', 'password', 'group1'), 
     ('user2', 'password', 'group10'), 
     ('user3', 'password', 'group1'), 
     ('user4', 'password', 'group4'), 
     ('user5', 'password', 'group10'), 
     ('user6', 'password', 'group10'), 
     ('user7', 'password', 'group2'), 
     ('user8', 'password', 'group10'); 

的結果,然後使用下面的語句檢查...

SELECT * FROM UserAccess 
ORDER BY UserID, 
     ID; 

產量爲達到目標。

如果您有任何問題或意見,請隨時發佈相應評論。

+0

我忘記包含的一件小事是「Active」標誌列......:/我似乎無法改變查詢以使其工作。請看我更新的問題。謝謝!! –

+0

答覆已更新。 – toonice

+0

OMG ...我只需要在我的查詢中將其更改爲「1」!謝謝!現在檢查出來...... –

相關問題