fresserettich
Here to stay
|
Hallo!
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
Bearbeitet von fresserettich am 21.05.2006, 18:56
|
d3ft0n3
grinder
|
hmmm, vllt. so in etwa:
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;
Bearbeitet von d3ft0n3 am 21.05.2006, 16:22
|
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 pr1 mitgearbeitet 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
Bearbeitet von fresserettich am 21.05.2006, 17:04
|
3mind
mimimi
|
hm, dann is vielleicht 'distinct' das was du suchst. so ungefähr: SELECT DISTINCT (Projekt1, Projekt2, Projekt3)
FROM <Tablename>
AS Projekt;
hth a bit.
Bearbeitet von 3mind am 21.05.2006, 17:11
|
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
|
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
Bearbeitet von fresserettich am 21.05.2006, 18:05
|
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
|
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
Bearbeitet von fresserettich am 22.05.2006, 00:42
|