1

我想编写一个删除脚本,从桥表中删除行(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 脚本:

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
)

======================

更新 2011 年 12 月 1 日下午 3:05

好的,为了完成这个,我想从 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
    )
)
4

4 回答 4

1

尝试使用“NOT IN”而不是“NOT EXISTS”。

编辑 2011 年 12 月 1 日 15:24

对于删除,您可以通过将它们转换为 varchar 然后将它们连接成单个字符串来验证这两个键的存在。这将允许您使“IN”工作。

DELETE FROM dbo.acucore_securitypermission
WHERE cast(entityid as VARCHAR(64)) + '-' + cast(esid as VARCHAR(64)) IN
(
    SELECT cast(entityid as VARCHAR(64)) + '-' + cast(esid as VARCHAR(64))
    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
    )
)

就像骆驼一样,它很丑,但它应该可以完成工作。

于 2011-12-01T20:50:45.970 回答
1

DELETE您只需要在andFROM子句中引用您要删除的表

DELETE FROM dbo.acucore_securitypermission 
FROM   dbo.acucore_securitycontainer 
       INNER JOIN dbo.acucore_securitypermission sp 
         ON dbo.acucore_securitycontainer.esid = sp.esid 
       INNER JOIN dbo.acucore_securitygroup 
         ON sp.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 
                              WHERE containername = 'UI.Web.AccessioningDashboard'
                                    AND permissions = 1)

这是特定于 SQL Server 从 Docs DELETE (Transact-SQL)

<table_source>

指定附加的 FROM 子句。这个对 DELETE 的 Transact-SQL 扩展允许<table_source>在第一个 FROM 子句中指定数据并从表中删除相应的行。

这个扩展,指定一个连接,可以用来代替 WHERE 子句中的子查询来标识要删除的行。

也就是说,如果您确实必须将其作为子查询来执行,则可以使用EXISTS

DELETE FROM dbo.acucore_securitypermission 
WHERE EXISTS
(
    SELEC *
    FROM dbo.acucore_securitycontainer
    INNER JOIN dbo.acucore_securitypermission sp ON dbo.acucore_securitycontainer.esid = sp.esid
    INNER JOIN dbo.acucore_securitygroup ON dbsp.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
    )
   AND dbo.acucore_securitypermission.entityid  = sp.entityid 
     and dbo.acucore_securitypermission.esid = sp.esid 
)
于 2011-12-01T20:57:54.633 回答
0

像这样:

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 IN -- <-------- Replace exists by 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
)
于 2011-12-01T20:51:11.290 回答
0

更改NOT EXISTSNOT IN

于 2011-12-01T20:51:20.053 回答