Just nu i M3-nätverket
Gå till innehåll

SQL fråga med NOT EXIST..


mambofeber

Rekommendera Poster

hej!

 

det finns 2 tabeller docs_in_builds (doc_id) och documents (doc_id) som är relaterade till varandra via fälten doc_id.

 

DOCUMENTS

--------------

Title: abc, doc_id: 123

Title: abc, doc_id: 456

 

DOCS_IN_BUILDS

doc_id: 123, build_id: A

doc_id: 456 , build_id: B

 

i build B finns det redan dokument med SAMMA TITEL som i bygge A. alltså får inte A:s titlar kopieras över till B, för du blir det dubbletter. nedan är den SQL fråga som väljer ut ALLA titlar fr bygge A, men ej ta med dem titlar som redan finns i bygge B. när jag körde fråga fick jag meddelandet att man inte kan köra en "sub-query". antar att den syftar på det fetstilta nedan? har för mig att man kan köra NOT EXIST eller liknande?

 

find A's documents title and compare if the same TITLE exist in B's build. If it does, do NOT include A's document with the same title as in build B.

[log]SET rs = anslut.execute("SELECT DISTINCT * AS FROM docs_in_builds, documents WHERE docs_in_builds.build_id='A' AND documents.doc_id = docs_in_builds.doc_id AND NOT ((SELECT documents.title FROM documents, docs_in_builds WHERE documents.doc_id = docs_in_builds.doc_id AND docs_in_builds.build_id='A') = (SELECT documents.title FROM documents, docs_in_builds WHERE documents.doc_id = docs_in_builds.doc_id AND docs_in_builds.build_id='B')) ORDER BY documents.title")[/log]

 

när ovanstående SQL fråga val exkluderat dem titlar som redan finns i bygg B, kopieras dem titlar som inte finns från bygge A till B i en annan SQL INSERT...fråga

 

[inlägget ändrat 2008-02-17 21:04:58 av mambofeber]

Länk till kommentar
Dela på andra webbplatser

Vad använder du för databas?

 

Det du kan göra är att LEFT JOIN:a tabellen med sig själv och sen plocka bort alla rader där titeln för bygge B inte är NULL.

 

Här är ett par varianter. De är förstås helt otestade, men nåt sånt här borde funka.

 

SELECT da.* FROM 
(SELECT * FROM docs_in_build dib, documents d, 
WHERE dib.doc_id = d.doc_id AND dib.build_id = 'A') da 
LEFT JOIN 
(SELECT * FROM docs_in_build dib, documents d, 
WHERE dib.doc_id = d.doc_id AND dib.build_id = 'B') db
ON (da.title = db.title) 
WHERE db.title IS NULL

 

SELECT diba.*, da.* FROM docs_in_build diba, 
docs_in_build dibb, 
documents da LEFT JOIN documents db ON (da.title = db.title)
WHERE
db.title IS NULL
AND diba.doc_id = da.doc_id AND diba.build_id = 'A'
AND dibb.doc_id = db.doc_id AND dibb.build_id = 'B'

 

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...