| fresserettich
      Here to stay
 | 
         Hallo!Bearbeitet von fresserettich am 21.05.2006, 18:56
 Ich suche ein SQL-Statement was folgendes macht:
 ich habe in einer tabelle mehrere spalten (name,vname,...) darunter die  3 spalten projekt1,projekt2,projekt3
 in diesen tables stehen einfach namen z.B. p1,p2,p3, ...
 ich möchte aus diesen 3 spalten eine machen und die eventuell vorhanden redunanzen beseitigen
 habe jetzt schon ziemlich lang gewerkt und bringe es einfach nicht hin.
 Bitte keine Diskussion über die Wahl der Tabellen Struktur, denn ich weil genau diese völlig nicht normalisierte tabelle in eine vernüpftige form bringen
 | 
  | d3ft0n3
      grinder   | 
         hmmm, vllt. so in etwa:Bearbeitet von d3ft0n3 am 21.05.2006, 16:22
 CREATE VIEW tablename_view (col1, col2, coln, projekt) AS
 SELECT col1, col2, coln, (SELECT projekt1, projekt2, projekt3
 FROM tablename
 WHERE projekt2 NOT IN (SELECT projekt2 FROM tablename; )
 AND projekt3 NOT IN (SELECT projekt1 FROM tablename; )
 AND projekt3 NOT IN (SELECT projekt2 FROM tablename; ))
 FROM tablename;
 | 
  | rettich
      Legendwaffle, waffle!
         | 
         wie soll das funktionieren, "die redundanzen beseitigen"? bzw was für ein ergebnis erwartest du, wenns KEINE redundanzen gibt, sondern in einem record verschiedene projekte eingetragen sind?
 zB wenn in record nr 17 bei name "hansi", bei projekt1 "blah", bei projekt2 "blubb" steht, was soll rauskommen?
 
 
 mit der funktion COALESCE kannst du mehrere spalten zu einer machen: folgende regel: er nimmt die, die als erste nicht NULL ist.
 
 aus
 name - projekt1 - projekt2 - projekt3
 hansi - blah - blubb - NULL
 
 würdest du mit
 
 select name, COALESCE(projekt3,projekt2,projekt1) as projekt from table
 
 das ergebnis
 name - projekt
 hansi - blubb
 
 bekommen. ich befürchte aber, damit kann man dein problem nicht lösen.
 | 
  | fresserettich
      Here to stay
 | 
         na ja es kann sein dass der mitarbeiter aus der zeile 1 im pr1Bearbeitet von fresserettich am 21.05.2006, 17:04mitgearbeitet hat und der mitarbeiter x auch wo jetzt pr1 in der spalte projekt1,projekt2,projekt3 steht kann man ja nicht wissen
 als ergebnis soll einfach jede projekt-bezeichnung nur einmal dastehen
 also ergebnis:
 pr1
 pr2
 .
 .
 .
 
 ungefähr klar was ich will?
 edit:
 die redundanz besteht darin, dass eben eine projektbezeichnung mehrmals vorkommen kann
 ich will eigentlich nur aus den daten die ganzen projektbezeichnungen in eine eigene projekte-table überführen
 ich will aus den 3 spalten wo projektbezeichungen drinnen stehen eine spalte machen wo jede bezeichnung nur einmal vorkommt
 meine lösung die mir eingefallen ist, würde so ausschauen alle dreispalten in eine dummy table speichern und dann einfach mit distinct die datensätze in die projekte-table kopieren
 | 
  | 3mind
      mimimi   | Bearbeitet von 3mind am 21.05.2006, 17:11
         hm, dann is vielleicht 'distinct' das was du suchst. so ungefähr: SELECT DISTINCT (Projekt1, Projekt2, Projekt3) 
FROM <Tablename>
AS Projekt;
 hth a bit.
     | 
  | fresserettich
      Here to stay
 | 
         hm, dann is vielleicht 'distinct' das was du suchst.
 so ungefähr:
 
 
 SELECT DISTINCT (Projekt1, Projekt2, Projekt3) 
FROM <Tablename>
AS Projekt;
 
 hth a bit.
 hätte ich auch schon veruscht bekome leider den fehler rechte klammer fehlt
     | 
  | 3mind
      mimimi   | 
         schon ohne klammer probiert?wobei dann wird vermutlich das distinct nur auf projekt1 angewandt, oder?
 
 
 edit:
 
 <quote>
 The DISTINCT clause can be used with more than one field.
 
 For example:
 
 SELECT DISTINCT city, state
 FROM supplier;
 
 This select statement would return each unique city and state combination. In this case, the distinct applies to each field listed after the DISTINCT keyword.
 </quote>
 
 
 vielleicht gehts ja so?
 | 
  | fresserettich
      Here to stay
 | Bearbeitet von fresserettich am 21.05.2006, 18:05
         dann bekomm ich 3 einzelne spalten ... bin irgendwie am verzweifeln ich hab mir jetzt eine table dummy anlegt dort mach ich insert into dummy select distinct projekt1 from ext_daten; das für die andern 2 spalten auch so jetzt sind einige spalten null  wenn ich diese jetzt löschen will dann bekomm ich immer 0 zeilen gelöscht habe zur sicherheit einen datensatz mit null hinzufüget delete dummy where column1 = null bewirkt genau nix   edit: wenn man halt noch wüsste dass man null mit is null bzw. is not null abprüft soll würde man sich solch einen post sparen
     | 
  | 3mind
      mimimi   | 
         hm, wenns geht post doch mal das create statement für deine tabelle, inkl. entsprechenden sample inserts.
 dann kann ich wenn ich zeit hab mal bei mir in der datenbank herumprobieren.
 | 
  | fresserettich
      Here to stay
 | 
         brauchs aber morgen   ich hol mir die daten aus einer external table kannst dir aber das create statment daraus entnehmen  test-daten siehe anhang create table ext_daten2(vname varchar(30), nname varchar(30), gebdatum varchar(15),
    telefon varchar (30), mobil varchar (30),
    projekt1 varchar(10), dauer1 number,
    projekt2 varchar(10),dauer2 number,
    projekt3 varchar(10), dauer3 number,
    plz varchar(4), ort varchar(30), job varchar(30))
    organization external
    (
     type oracle_loader
    default directory DCmartin
    access parameters
    (records delimited  by newline
    Fields terminated  by ';'
    missing field values are null)
    Location ('adat.csv')
  )
   daten_94691.txt (downloaded 52x) | 
  | 3mind
      mimimi   | 
         werds ma gleich mal anschauen...
     | 
  | rettich
      Legendwaffle, waffle!
         | 
         ich würde folgendes machen - die datenbank normalisieren.
 dh du erstellst eine tabelle "projekte" mit feldern "id" und "projektname". die füllst du mit einem
 
 select distinct projekt1 as projektname from ext_daten2
 union
 select distinct projekt2 as projektname from ext_daten2
 union
 select distinct projekt3 as projektname from ext_daten2
 
 damit hast mal alle projekte unique aufgelistet.
 
 jetzt brauchst eine intersection-table, in der du projekte und mitabeiter auskreuzt:
 
 table x_ma_proj, felder "id", "ma_id", "proj_id"
 
 und jetzt trägst du für jeden mitarbeiter, der werte in projekt1,2 oder 3 hat, einen passenden eintrag mit mitarbeiter_id und projekt_id ein. du erhältst damit für jedes gefundene projekt einen eintrag.
 
 damit hast du die m:n beziehung zwischen mitarbeitern und projekten datenbanktechnisch korrekt abgebildet
 
 mitarbeiter <- x_ma_proj -> projekte
 | 
  | fresserettich
      Here to stay
 | 
         rettich wieso hast mir des mit den union nicht gleich gepostet? genau das hab ich gebraucht meine lösung war jetzt die einzelnen statments die du mit dem union vereint hast in eine dummy table zu stecken und dann mit distinct die werte zu filtern    normalisiert hab ich schon aufabe: ist man bekommt halt ein nicht normalisiertes excel-blatt so wie es halt viele firmen machen die keine richtige edv haben und ich möcht des schön sauber in eine db bringen  des was du dann beschrieben hast geht schon des statement zum insert ist dann im sql + 7 zeilen lang   i sag nur rettich for president    | 
  | 3mind
      mimimi   | 
         ach, damn it - jetzt wollt ich das auch grad posten.naja, hauptsach es funktioniert jetzt.
 | 
  | fresserettich
      Here to stay
 | Bearbeitet von fresserettich am 22.05.2006, 00:42
         is wohl doch noch nicht ganz gelöst insert into projekte (sub-select von rettich); funzt leider nicht   na ok doch nur man muss insert into projekte projekt1 from (select rettich) ich werds für heute bleiben lassen
     |