Anmelden

View Full Version : view-Satz eindeutig identifizieren



Robi
31-03-05, 09:01
Hi *all
kann ich in einem create view einen eindeutigen Begriff je Satz vergeben? Habe identity column versucht, das geht aber anscheinend nur bei create table. Lass ich mir im SQL mit RRN(viewname) die Satznr anzeigen, so ist das die Satznr. der 1. Datei und daher manchmal doppelt. Ich suche aber die möglichkeit genau einen 'Satz' der view anzusprechen.
Ich weiß natürlich, das sich die View immer dann ändert, wenn sich in der View verbundene Dateien ändern.
Hat jemand eine Idee ?

Gruß Robi

BenderD
31-03-05, 09:12
Hallo,

das SQL Construct dafür ist eigentlich select distinct ...
dann bekommst du immer einen Satz. Was hast du denn wirklich vor?

mfg

Dieter Bender


Hi *all
kann ich in einem create view einen eindeutigen Begriff je Satz vergeben? Habe identity column versucht, das geht aber anscheinend nur bei create table. Lass ich mir im SQL mit RRN(viewname) die Satznr anzeigen, so ist das die Satznr. der 1. Datei und daher manchmal doppelt. Ich suche aber die möglichkeit genau einen 'Satz' der view anzusprechen.
Ich weiß natürlich, das sich die View immer dann ändert, wenn sich in der View verbundene Dateien ändern.
Hat jemand eine Idee ?

Gruß Robi

Fuerchau
31-03-05, 09:38
Einen eindeutigen Schlüssel bekommst du nur, wenn auch 1 oder mehrere Felder in Kombination eindeutig sind (analog eines UNIQUE-Key's). Da eine View nicht statisch ist, kannst du keine ID generieren.
Alternativ ist eine UDF (User defined Function) die beim Init (1. Aufruf) eine Zähler startet und bei jedem Aufruf erhöht (Arbeitsbereich der UDF).
Allerdings kann dieser Wert in keiner Weise als Zugriff dienen.

B.Hauser
31-03-05, 11:09
Hi *all
kann ich in einem create view einen eindeutigen Begriff je Satz vergeben? Habe identity column versucht, das geht aber anscheinend nur bei create table. Lass ich mir im SQL mit RRN(viewname) die Satznr anzeigen, so ist das die Satznr. der 1. Datei und daher manchmal doppelt. Ich suche aber die möglichkeit genau einen 'Satz' der view anzusprechen.
Ich weiß natürlich, das sich die View immer dann ändert, wenn sich in der View verbundene Dateien ändern.
Hat jemand eine Idee ?

Gruß Robi

Wenn Du mehrere Dateien joinst, kannst Du auch für jede Datei die relative Satz-Nr. abfragen. Dein eindeutiger Schlüssel besteht dann aus der Kombination dieser relativen Satz-Nr.


Create View MySchema/MyView as
Select RRN(a), RRN(b), a.*, b.*
from FileA a join FileB b on a.Key1 = b.Key1


Es gibt auch noch andere Möglichkeiten eine laufende Nummerierung zu erhalten.

Aber alle diese Möglichkeiten führen zu einer extrem bescheidenen Performance, da Indices nur über Spalten in den Basis-Dateien gebildet werden können. Wenn Du also auf solche Konstrukte oder die relative Satz-Nr. zugreifen möchtest, wird wahrscheinlich für jede einzelne Datei ein Table Scan durchgeführt und das dauert u.U. wenn so ein paar Millionchen Sätze in den Dateien vorhanden sind.

Wenn die einzelnen Dateien jeweils einen unique key haben, so ist der eindeutige Schlüssel in deiner View die Kombination aller dieser Schlüssel-Felder. Greifst Du damit zu, kann der Optimizer die unique constraints oder Indices verwenden um auf die Dateien zuzugreifen.

Birgitta

Robi
31-03-05, 14:19
@Dieter
Eine View wird im Subfile angezeigt, ein 'Satz' wird ausgewählt und an Standard Pgm übergeben. Normalerweise nur die Satznr., und das Standard Programm liest nach. Also brauche ich soetwas wie eine eindeutige Satznr.
(das mit dem distinct is bekannt, geht hier aber nicht)

@Fuerchau
Wenn der Wert nicht als Zugriff dienen kann, nützt es mir leider nix, schade

@Brigitta
Könnte gehen. geht dan folgendes ?

Create View MySchema/MyView as
Select RRN(a) as RRnA, RRN(b) as RRnB, a.*, b.*
from FileA a join FileB b on a.Key1 = b.Key1


select * from MySchema/MyView where RRna=12345 and RRnB=6789

Ist das schnell genug ?
gruß
Robi

Fuerchau
31-03-05, 14:29
Genau das ist doch das Problem !
Beim Suchen über RRN wird die gesamte Tabelle gescant, da es keinen Zugriffspfad nach RRN gibt.
Um also auf RRNA=12345 zuzugreifen werden 12344 Sätze gelesen. Stell dir das nun bei einem Zugriff auf RRNA=12345678 vor ?!?!?

Um SCHNELL zuzugreifen benötigst du einfach einen EINDEUTIGEN KEY ungleich RRN !
Ansonsten vergiss SQL und greif per CHAIN auf die PF. Da kannst du dann die RRN verwenden.

B.Hauser
31-03-05, 14:58
Genau das ist doch das Problem !
Beim Suchen über RRN wird die gesamte Tabelle gescant, da es keinen Zugriffspfad nach RRN gibt.
Um also auf RRNA=12345 zuzugreifen werden 12344 Sätze gelesen. Stell dir das nun bei einem Zugriff auf RRNA=12345678 vor ?!?!?

Um SCHNELL zuzugreifen benötigst du einfach einen EINDEUTIGEN KEY ungleich RRN !
Ansonsten vergiss SQL und greif per CHAIN auf die PF. Da kannst du dann die RRN verwenden.

@Fuerchau
Kleine Korrektur es werden nicht 12344 Sätze gelesen, sondern 12345678 Sätze inclusive aller gelöschten Sätze, was noch weit schlimmer ist.

@Robi
Du hast wirklich nur die Möglichkeit beide relativen Satz-Nr. zu übergeben und dann auf die Original-Dateien mit CHAIN zuzugreifen.

Robi
31-03-05, 15:10
Schade,
da muß ich mir wohl was einfallen lassen

Ich dank Euch trotzdem für die Antworten.

gruß
Robi