Comment écrire une déclaration de suppression SQL avec une déclaration SELECT dans la clause WHERE?

Base De Données: Sybase Advantage 11

dans ma quête de normaliser les données, j'essaie de supprimer les résultats que j'obtiens de cette déclaration SELECT :

SELECT tableA.entitynum
FROM tableA q
INNER JOIN tableB u on (u.qlabel = q.entityrole AND u.fieldnum = q.fieldnum) 
WHERE (LENGTH(q.memotext) NOT IN (8,9,10) 
OR q.memotext NOT LIKE '%/%/%')
AND (u.FldFormat = 'Date')
;

C'est la déclaration DELETE que j'ai faite:

DELETE FROM tableA
WHERE (SELECT q.entitynum
FROM tableA q
INNER JOIN tableB u on (u.qlabel = q.entityrole AND u.fieldnum = q.fieldnum) 
WHERE (LENGTH(q.memotext) NOT IN (8,9,10) 
OR q.memotext NOT LIKE '%/%/%')
AND (u.FldFormat = 'Date'))
;

je reçois continuellement cette erreur quand j'essaie d'exécuter cette instruction:

ERROR IN SCRIPT: poQuery: Error 7200:  AQE Error:  State = S0000;   NativeError = 2124;
[iAnywhere Solutions][Advantage SQL Engine]Invalid operand for operator: = Boolean value
cannot be operated with non-Boolean value.

j'ai aussi essayé cette déclaration:

DELETE FROM tableA 
INNER JOIN tableB u on (u.qlabel = tableA.entityrole AND u.fieldnum = tableA.fieldnum) 
WHERE (LENGTH(q.memotext) NOT IN (8,9,10) 
OR tableA.memotext NOT LIKE '%/%/%')
AND (u.FldFormat = 'Date')
;

qui se traduit par:

ERROR IN SCRIPT: poQuery: Error 7200:  AQE Error:  State = 42000;   NativeError = 2117;
[iAnywhere Solutions][Advantage SQL Engine] Unexpected token: INNER -- Expecting semicolon.
-- Location of error in the SQL statement is: 23 (line: 2 column: 1)

est-ce que quelqu'un pourrait m'aider à construire correctement une requête de suppression qui entraînera la suppression des données appropriées?

45
demandé sur Jonathan Leffler 2013-07-09 16:56:30

5 réponses

vous devez identifier la clé primaire dans TableA afin de supprimer l'enregistrement correct. La clé primaire peut être une colonne simple ou une combinaison de plusieurs colonnes qui identifient de façon unique une rangée dans le tableau. S'il n'y a pas de clé primaire, la colonne de pseudo-ROWID peut être utilisée comme clé primaire.

DELETE FROM tableA
WHERE ROWID IN 
  ( SELECT q.ROWID
    FROM tableA q
      INNER JOIN tableB u on (u.qlabel = q.entityrole AND u.fieldnum = q.fieldnum) 
    WHERE (LENGTH(q.memotext) NOT IN (8,9,10) OR q.memotext NOT LIKE '%/%/%')
      AND (u.FldFormat = 'Date'));
85
répondu Alex W 2013-07-10 16:35:39

vous N'auriez pas dû:

DELETE FROM tableA WHERE entitynum IN (...your select...)

Maintenant vous avez juste un endroit sans comparaison:

DELETE FROM tableA WHERE (...your select...)

ainsi votre requête finale ressemblerait à ceci;

DELETE FROM tableA WHERE entitynum IN (
    SELECT tableA.entitynum FROM tableA q
      INNER JOIN tableB u on (u.qlabel = q.entityrole AND u.fieldnum = q.fieldnum) 
    WHERE (LENGTH(q.memotext) NOT IN (8,9,10) OR q.memotext NOT LIKE '%/%/%')
      AND (u.FldFormat = 'Date')
)
11
répondu epoch 2018-03-20 14:21:26

j'ai modifié votre 2ème requête pour le faire fonctionner. Je pense que c'est plus simple que d'utiliser un imbriquée SELECT déclaration, comme dans les autres réponses.

DELETE q
FROM tableA q
INNER JOIN tableB u on (u.qlabel = q.entityrole AND u.fieldnum = q.fieldnum) 
WHERE (LENGTH(q.memotext) NOT IN (8,9,10) 
OR q.memotext NOT LIKE '%/%/%')
AND (u.FldFormat = 'Date')

plus de détails ici:

Comment supprimer en utilisant INNER JOIN avec SQL Server?

9
répondu MarredCheese 2017-05-23 11:54:40

dans ce scénario:

DELETE FROM tableA
WHERE (SELECT q.entitynum
FROM tableA q
INNER JOIN tableB u on (u.qlabel = q.entityrole AND u.fieldnum = q.fieldnum) 
WHERE (LENGTH(q.memotext) NOT IN (8,9,10) 
OR q.memotext NOT LIKE '%/%/%')
AND (u.FldFormat = 'Date'));

ne manquez-vous pas la colonne à laquelle vous voulez comparer? exemple:

DELETE FROM tableA
WHERE entitynum in (SELECT q.entitynum
FROM tableA q
INNER JOIN tableB u on (u.qlabel = q.entityrole AND u.fieldnum = q.fieldnum) 
WHERE (LENGTH(q.memotext) NOT IN (8,9,10) 
OR q.memotext NOT LIKE '%/%/%')
AND (u.FldFormat = 'Date'));    

je suppose que c'est cette colonne puisque dans votre énoncé select vous sélectionnez à partir de la même table que vous voulez supprimer à partir de cette colonne.

4
répondu Andres 2013-07-09 13:02:43

a fait quelque chose comme ça une fois:

CREATE TABLE exclusions(excl VARCHAR(250));
INSERT INTO exclusions(excl)
VALUES
       ('%timeline%'),
       ('%Placeholders%'),
       ('%Stages%'),
       ('%master_stage_1205x465%'),
       ('%Accessories%'),
       ('%chosen-sprite.png'),
('%WebResource.axd');
GO
CREATE VIEW ToBeDeleted AS 
SELECT * FROM chunks
       WHERE chunks.file_id IN
       (
       SELECT DISTINCT
             lf.file_id
       FROM LargeFiles lf
       WHERE lf.file_id NOT IN
             (
             SELECT DISTINCT
                    lf.file_id
             FROM LargeFiles lf
                LEFT JOIN exclusions e ON(lf.URL LIKE e.excl)
                WHERE e.excl IS NULL
             )
       );
GO
CHECKPOINT
GO
SET NOCOUNT ON;
DECLARE @r INT;
SET @r = 1;
WHILE @r>0

BEGIN
    DELETE TOP (10000) FROM ToBeDeleted;
    SET @r = @@ROWCOUNT  
END
GO
1
répondu Matthew Hub 2016-05-16 13:59:55