03. januar 2005 - 14:30Der er
6 kommentarer og 2 løsninger
SQL: Udsøg og dublér
Jeg har en tabel med eksempelindhold:
TextID, SprogID, Text 1, 1, Dreng 1, 2, Boy 1, 3, Junge 2, 1, Pige 2, 2, Girl 3, 1, By 3, 2, City 3, 3, Stadt ...
Kan jeg med SQL udsøge alle de TextID'er, hvor der f.eks. ikke findes en post med SprogID = 3 (i eksemplet ovenfor mangler TextID 2 en sådan). OG samtidig, eller med seperat SQL lave en dublat af posten med SprogID = 1 men med prefixet 'translate:' i Text.
Senere kan man jo så nemt udsøge alle poster med Text like 'translate:%'...
Med følgende SQL vil du få en liste over de kombinationer som ikke er defineret, og med teksten 'translate:'. I dit eksempelindhold vil du få 2, 3, translate: som svar.
Select C.TextID, C.SprogID, 'translate:' as Text from ( Select Distinct A.TextID, B.SprogID from testtabel A, ( Select Distinct SprogId from testtabel) as B) as C where NOT EXISTS (Select * from testtabel D where D.TextID = C.TextID and D.SprogID = C.SprogID)
SELECT TextID FROM tabel WHERE TextID NOT IN (SELECT TextID FROM tabel WHERE SprogID=3)
og
SELECT t1.TextID,3,(SELECT 'translate:' + t2.Text FROM tabel t2 WHERE t2.TextID=t1.TextID AND t2.SprogID=3) FROM tabel t1 WHERE t1.TextID NOT IN (SELECT TextID FROM tabel WHERE SprogID=3)
Jeg har justeret lidt på min første SQL, for at få med den danske tekst på 'translate:'. Den burde også være lidt mere effektiv, da der laves en distinct select både på tabel a og b.
Formålet med denne SQL er at den vil søge igennem alle kombinationer, uden at behøve specificere hvilken SprogID der skal checkes.
Nedenstånde SQL kan udvides med en INSERT INTO for at automaisk inserte manglende kombinationer i din tabel.
Select C.TextID, C.SprogID, 'translate:' + C.Text as Text from ( Select Distinct B.TextID, A.SprogID, B.Text from (Select Distinct SprogID from TestTabel) as A, ( Select TextID, Text from TestTabel where SprogID = 1) as B) as C where NOT EXISTS (Select * from testtabel D where D.TextID = C.TextID and D.SprogID = C.SprogID)
Efter nogen fumlen med det kom en kollega forbi og stykkede følgende sammen, som gør arbejdet:
INSERT INTO Tabel (TextId, SprogId, Text) (SELECT textid, 3 as Sprogid, 'translate:' + Text as text FROM Tabel WHERE TextID NOT IN (SELECT TextID FROM Tabel WHERE SprogID=3) and Sprogid = 1)
I skal dog have points begge to, så opret lige svar.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.