I’d like to write a delete script that deletes rows out of the bridge table (acucore_securitypermission). Right now, this SELECT query (that will be the rows I’d like to delete) doesn’t work. I get red underlines on the line containing the “NOT EXISTS”. The only difference from the first and second snippet is the SELECT * vs. DELETE. Also, if you have some improvements that I can make to my delete to make it cleaner (without repetition), I’m always looking for tips.
SELECT script that doesn’t work:
SELECT groupname
FROM dbo.acucore_securitycontainer
INNER JOIN dbo.acucore_securitypermission ON dbo.acucore_securitycontainer.esid = dbo.acucore_securitypermission.esid
INNER JOIN dbo.acucore_securitygroup ON dbo.acucore_securitypermission.entityid = dbo.acucore_securitygroup.entityid
WHERE containername LIKE '%:UI.Web.AccessioningDashboard'
AND groupname NOT EXISTS -- <-------- I get red error underlines here!
(
SELECT
groupname
FROM dbo.acucore_securitycontainer
INNER JOIN dbo.acucore_securitypermission ON dbo.acucore_securitycontainer.esid = dbo.acucore_securitypermission.esid
INNER JOIN dbo.acucore_securitygroup ON dbo.acucore_securitypermission.entityid = dbo.acucore_securitygroup.entityid
WHERE containername = 'UI.Web.AccessioningDashboard'
AND permissions = 1
)
DELETE script that I want to eventually run:
DELETE FROM dbo.acucore_securitycontainer
INNER JOIN dbo.acucore_securitypermission ON dbo.acucore_securitycontainer.esid = dbo.acucore_securitypermission.esid
INNER JOIN dbo.acucore_securitygroup ON dbo.acucore_securitypermission.entityid = dbo.acucore_securitygroup.entityid
WHERE containername LIKE '%:UI.Web.AccessioningDashboard'
AND groupname NOT EXISTS
(
SELECT
groupname
FROM dbo.acucore_securitycontainer
INNER JOIN dbo.acucore_securitypermission ON dbo.acucore_securitycontainer.esid = dbo.acucore_securitypermission.esid
INNER JOIN dbo.acucore_securitygroup ON dbo.acucore_securitypermission.entityid = dbo.acucore_securitygroup.entityid
WHERE containername = 'UI.Web.AccessioningDashboard'
AND permissions = 1
)
=====================
UPDATE 12/1/2011 @ 3:05pm
Okay, to finish this, I want to delete from the acucore_securitypermission bridge table. There are two keys in this table. How can I finish this? The SELECT query is the WHERE part containing the two key values.
DELETE FROM dbo.acucore_securitypermission
.... ????
SELECT
dbo.acucore_securitypermission.entityid,
dbo.acucore_securitypermission.esid
FROM dbo.acucore_securitycontainer
INNER JOIN dbo.acucore_securitypermission ON dbo.acucore_securitycontainer.esid = dbo.acucore_securitypermission.esid
INNER JOIN dbo.acucore_securitygroup ON dbo.acucore_securitypermission.entityid = dbo.acucore_securitygroup.entityid
WHERE containername LIKE '%:UI.Web.AccessioningDashboard'
AND groupname NOT IN
(
SELECT
groupname
FROM dbo.acucore_securitycontainer
INNER JOIN dbo.acucore_securitypermission ON dbo.acucore_securitycontainer.esid = dbo.acucore_securitypermission.esid
INNER JOIN dbo.acucore_securitygroup ON dbo.acucore_securitypermission.entityid = dbo.acucore_securitygroup.entityid
WHERE containername = 'UI.Web.AccessioningDashboard'
AND permissions = 1
)
==========
Final Answer:
DELETE FROM dbo.acucore_securitypermission
WHERE
'ENTITYID:' + cast(dbo.acucore_securitypermission.entityid as VARCHAR(64)) + '|'
+ 'ESID:' + cast(dbo.acucore_securitypermission.esid as VARCHAR(64)) IN
(
SELECT
--groupname,
--containername,
--dbo.acucore_securitypermission.esid ,
--dbo.acucore_securitypermission.entityid ,
--dbo.acucore_securitypermission.permissions
'ENTITYID:' + cast(dbo.acucore_securitypermission.entityid as VARCHAR(64)) + '|'
+ 'ESID:' + cast(dbo.acucore_securitypermission.esid as VARCHAR(64))
FROM dbo.acucore_securitypermission
JOIN dbo.acucore_securitycontainer ON dbo.acucore_securitypermission.esid = dbo.acucore_securitycontainer.esid
JOIN dbo.acucore_securitygroup ON dbo.acucore_securitypermission.entityid = dbo.acucore_securitygroup.entityid
WHERE containername LIKE 'S:UI.Web.AccessioningDashboard'
AND groupname NOT IN
(
SELECT
CASE WHEN groupname IN ('Accessioning', 'Screening', 'Positive Certify', 'Negative Certify', 'Confirmation') THEN 'Saliva: ' + groupname ELSE groupname END
FROM dbo.acucore_securitypermission
JOIN dbo.acucore_securitycontainer ON dbo.acucore_securitypermission.esid = dbo.acucore_securitycontainer.esid
JOIN dbo.acucore_securitygroup ON dbo.acucore_securitypermission.entityid = dbo.acucore_securitygroup.entityid
WHERE containername = 'UI.Web.AccessioningDashboard'
AND permissions = 1
)
)
Try using “NOT IN” instead of “NOT EXISTS”.
Edit 12/01/2011 15:24
For the delete, you could verify the existence of both keys by converting them to a varchar and then concatenating them into a single string. That would allow you to make the “IN” work.
Like a camel, it’s ugly but it should get the job done.