Search code examples
sqljoinexistsdelete-row

Delete row from sql table where values not found in another table with multiple joins


I have the following query which returns the desired data. What I want to do is delete that data, however when I change the Select DQ.* to DELETE FROM DQ, I get an error indicating that

'... not updatable because the modification affects multiple base table'

I need to delete entries from the tbaccess_groupPermission table where appropriate module records are not found in the tbaccess_companyModules table.

WITH DQ AS
(
SELECT GP.* FROM tbaccess_groupPermission GP
JOIN tbaccess_groups G ON GP.GroupID = G.ID
WHERE G.CompanyID=6
AND GP.RoleName NOT IN
(
select Distinct(R.RoleName)
FROM tbAccess_Roles R
INNER JOIN tbAccess_CompanyModules C on R.ModuleID = C.ModuleID
WHERE C.CompanyID = 6) 
) 
SELECT * FROM DQ

Solution

  • Why not change the WITH statement to use an IN clause?

    Something like

    WITH DQ AS
    (
    SELECT GP.* FROM tbaccess_groupPermission GP
    WHERE GP.GroupID IN (SELECT G.ID FROM tbaccess_groups G WHERE G.CompanyID=6)
    AND GP.RoleName NOT IN
    (
    select Distinct(R.RoleName)
    FROM tbAccess_Roles R
    INNER JOIN tbAccess_CompanyModules C on R.ModuleID = C.ModuleID
    WHERE C.CompanyID = 6) 
    )