Datenbank: Sybase Advantage 11
Bei meinem Versuch, Daten zu normalisieren, versuche ich, die Ergebnisse zu löschen, die ich aus dieser SELECT
Aussage erhalte :
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')
;
Dies ist die DELETE
Aussage, die ich mir ausgedacht habe:
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'))
;
Ich erhalte ständig diesen Fehler, wenn ich versuche, diese Anweisung auszuführen:
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.
Ich habe auch diese Aussage versucht:
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')
;
Was in ... endet:
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)
Könnte mir jemand helfen, eine DELETE-Abfrage richtig zu erstellen, die dazu führt, dass die richtigen Daten entfernt werden?
Antworten:
Sie müssen den Primärschlüssel in Tabelle A identifizieren, um den richtigen Datensatz zu löschen. Der Primärschlüssel kann eine einzelne Spalte oder eine Kombination mehrerer Spalten sein, die eine Zeile in der Tabelle eindeutig identifiziert. Wenn kein Primärschlüssel vorhanden ist, kann die ROWID-Pseudospalte als Primärschlüssel verwendet werden.
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'));
quelle
Ihre zweite
DELETE
Anfrage war fast richtig. Stellen Sie einfach sicher, dass Sie den Tabellennamen (oder einen Alias) dazwischen setzenDELETE
undFROM
angeben, aus welcher Tabelle Sie löschen möchten. Dies ist einfacher als die Verwendung einer verschachteltenSELECT
Anweisung wie in den anderen Antworten.Korrigierte Abfrage (Option 1: Verwenden des vollständigen Tabellennamens):
DELETE tableA FROM tableA INNER JOIN tableB u on (u.qlabel = tableA.entityrole AND u.fieldnum = tableA.fieldnum) WHERE (LENGTH(tableA.memotext) NOT IN (8,9,10) OR tableA.memotext NOT LIKE '%/%/%') AND (u.FldFormat = 'Date')
Korrigierte Abfrage (Option 2: Verwenden eines Alias):
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')
Weitere Beispiele hier:
Löschen mit INNER JOIN mit SQL Server
quelle
Sollten Sie nicht haben:
DELETE FROM tableA WHERE entitynum IN (...your select...)
Jetzt haben Sie nur noch ein WO ohne Vergleich:
DELETE FROM tableA WHERE (...your select...)
Ihre letzte Anfrage würde also so aussehen.
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') )
quelle
In diesem Szenario:
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'));
Vermissen Sie nicht die Spalte, mit der Sie vergleichen möchten? Beispiel:
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'));
Ich gehe davon aus, dass es sich um diese Spalte handelt, da Sie in Ihrer select-Anweisung aus derselben Tabelle auswählen, aus der Sie mit dieser Spalte löschen möchten.
quelle
Hab so etwas mal gemacht:
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
quelle