Table1:
StudentId (nvarchar(50)) | Score (int) |
---|---|
abc | 56 |
def | 34 |
abc | 95 |
Table2:
MemberId (nvarchar(50), no duplicates) | ComputerId (nvarchar(50)) | ClassId (int) |
---|---|---|
abc | abc9119e-91d1-4205-8efe-ee87b7baa71 | 1 |
def | xyz9119e-91d1-4205-8efe-ee87b7b1111 | 2 |
efg | 123-456-789 | 1 |
hij | xyz9119e-91d1-4205-8efe-ee87b7b1111 | 3 |
I want to delete the records from table1
that matches the following condition in table2
, and insert the deleted into a different table (that has the same structure as table1
):
Condition: table1.StudentId = table2.MemberId AND (for that record) table2.ComputerId is a uniqueidentifier AND ClassId = 1;
So in the above example, both the "abc" records will be deleted. Note that there is no primary key in table1
.
My plan was to SELECT the correct records from table1
, then put that SELECT in a DELETE, and then OUTPUT the deleted records into a different table (ignore the OUTPUT part in the below code).
My SELECT for the condition works fine and selects those 2 records, but when I put it in a DELETE, it deletes everything in table1
.
My SELECT:
SELECT * FROM table1 A
WHERE EXISTS (SELECT *
FROM table2 B
WHERE A.StudentId = B.MemberId
AND TRY_CONVERT(UNIQUEIDENTIFIER, B.ComputerId) IS NULL AND ClassId <> 1)
My DELETE:
DELETE FROM table1
WHERE EXISTS (SELECT * FROM table1 A
WHERE EXISTS (SELECT *
FROM table2 B
WHERE A.StudentId = B.MemberId
AND TRY_CONVERT(UNIQUEIDENTIFIER, B.ComputerId) IS NULL AND ClassId <> 1)
)
OUTPUT DELETED.*
INTO <table to insert into>;
CodePudding user response:
This should work:
DELETE a
-- SELECT *
FROM table1 A
WHERE EXISTS
(
SELECT *
FROM table2 B
WHERE A.StudentId = B.MemberId
AND TRY_CONVERT(UNIQUEIDENTIFIER, B.ComputerId) IS NULL
AND ClassId <> 1
)
And probably would be better to use join
instead of where exists
like:
DELETE a
-- SELECT *
FROM table1 A
JOIN table2 B
on A.StudentId = B.MemberId
where TRY_CONVERT(UNIQUEIDENTIFIER, B.ComputerId) IS NULL
AND ClassId <> 1
You can find more here on dba.stackexchange.
CodePudding user response:
This may also make sense to you:
DELETE FROM table1 WHERE StudentId IN
(
SELECT memberId FROM table2 WHERE
TRY_CONVERT(UNIQUEIDENTIFIER, ComputerId) IS NULL AND ClassId <> 1
)
OUTPUT DELETED.* INTO <table to insert into>;