Я хотел бы написать скрипт удаления, который удаляет строки из таблицы мостов (acucore_securitypermission). Прямо сейчас этот запрос SELECT (это будут строки, которые я хотел бы удалить) не работает. Я получаю красные подчеркивания на строке, содержащей «НЕ СУЩЕСТВУЕТ». Единственное отличие от первого и второго фрагмента - это SELECT * против DELETE. Кроме того, если у вас есть некоторые улучшения, которые я могу внести в свое удаление, чтобы сделать его чище (без повторений), я всегда ищу советы.
SELECT скрипт, который не работает:
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 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
)
=====================
ОБНОВЛЕНИЕ 12/1/2011 @ 15:05 pm
Хорошо, чтобы закончить, я хочу удалить из таблицы моста acucore_securitypermission. В этой таблице есть два ключа. Как я могу закончить это? Запрос SELECT - это часть WHERE, содержащая два ключевых значения.
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
)
==========
Окончательный ответ:
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
)
)