1

ブリッジテーブルから行を削除する削除スクリプト(acucore_securitypermission)を作成したいと思います。現在、このSELECTクエリ(削除したい行になります)は機能しません。「NOTEXISTS」を含む行に赤い下線が表示されます。最初と2番目のスニペットとの唯一の違いは、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時5分

さて、これを完了するために、acucore_securitypermissionブリッジテーブルから削除したいと思います。このテーブルには2つのキーがあります。どうすればこれを終えることができますか?SELECTクエリは、2つのキー値を含む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

「NOTEXISTS」の代わりに「NOTIN」を使用してみてください。

2011年12月1日15:24を編集

削除の場合、両方のキーをvarcharに変換し、それらを1つの文字列に連結することで、両方のキーの存在を確認できます。これにより、「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に固有のドキュメントからの削除(Transact-SQL)

から<table_source>

追加のFROM句を指定します。<table_source>DELETEに対するこのTransact-SQL拡張機能を使用すると、最初の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 EXISTSに変更NOT IN

于 2011-12-01T20:51:20.053 に答える