2009-04-10 6 views
4

Ich habe eine MS Access-Datenbank, die übersetzte Sätze in Quelle-Ziel-Paaren enthält (ein Translation Memory für andere Benutzer von CAT-Tools). Etwas störend, Quelle und Ziel nicht in separaten Spalten gespeichert, aber wie diese in Reihen von ID verknüpft:SQL, um Zeilenpaare in MS ACCESS-Datenbank zu transponieren

+---+----+--------------+ 
|id |lang| text  | 
+---+----+--------------+ 
    1 a  lang a text 
    1 b  lang b text 
    2 a  more a text... 
    2 b  more b text... 
+---+----+--------------+ 

Welche SQL könnte ich das in eine Tabelle drehen verwenden wie:

+---+--------------+--------------+ 
|id | lang A  | lang B  | 
+---+--------------+--------------+ 
1 lang a text lang b text 
2 more a text... more b text... 

Leistung ist hier nicht wichtig, da würde ich nur das hin und wieder tun müssen, und die db ist nicht riesig (nur ein paar tausend Zeilen).

Antwort

6

Ein Kreuztabellenabfrage passen sollte.

TRANSFORM First([Text]) AS LangText 
SELECT ID, First([Text]) 
FROM Table 
GROUP BY ID 
PIVOT lang 

. Weitere Informationen: http://allenbrowne.com/ser-67.html

+0

Danke, ich kannte TRANSFORM nicht. Es produziert genau das Ergebnis, das ich brauche. Access scheint eine Spalte mit dem Namen "Expr1003" hinzuzufügen, die den gleichen Inhalt wie Sprache a (Quelle) hat, aber ich kann sie einfach ignorieren. –

+0

Sie können nur die SELECT-Zeile ändern, um zu lesen: SELECT ID – Fionnuala

2

Sie benötigen ein Self-Join:

SELECT 
    t1.id, t1.text AS lang_a, t2.text AS lang_b 
FROM 
    lang_table AS t1 
INNER JOIN 
    lang_table AS t2 
ON 
    (t1.id = t2.id) 
WHERE 
    t1.lang = 'a' 
AND 
    t2.lang = 'b' 
+0

In Access ergibt sich eine Tabelle, die die richtigen Spalten hat, aber beide lang_a und lang_b Spalten enthält den gleichen Sprachtext (lang_a). Es zeigt nur die gleiche lang_a jedes Datensatzes zweimal. Ich weiß, dass dies die WHERE-Bedingung verletzt, aber das ist, was ich bekomme. (Fortsetzung) –

+0

(Forts.) Das Hinzufügen von t1.lang und t2.lang zur Auswahl zeigt die richtigen Sprach-IDs an. Ich bin mehrmals darüber gegangen, aber ich konnte das Problem nicht lösen. –

0
select a.id, a.text as 'lang A', b.text as 'lang B' 
from table a join table b on (a.id = b.id) 
where a.lang = 'a' and b.lang = 'b'; 

wo "Tisch" ist, was Tabelle sind diese in

0
SELECT a.id, 
MAX(CASE WHEN a.lang LIKE 'a' THEN a.text) AS Lang A, 
MAX(CASE WHEN a.lang LIKE 'a' THEN a.text) AS Lang A 
FROM table a 
GROUP BY a.id