
Whiz-zarD
Mitglieder-
Gesamte Inhalte
2076 -
Benutzer seit
-
Letzter Besuch
-
Tagessiege
51
Inhaltstyp
Profile
Forum
Downloads
Kalender
Blogs
Shop
Alle Inhalte von Whiz-zarD
-
Nein, ich bin hier so ziemlich der einzige, der tatsächlich auf die Fragen vom Threadersteller eingegangen ist ich versuche auch die gefährlichen Aussagen einiger Nutzer zu korrigieren. Ich habe auch nicht mit der Where- und Join-Geschichte angefangen. Eine Where-Klausel ist nun mal kein Join. Ein impliziter Join ist IMMER nur ein Cross Join und nichts anderes. Was man hinterher in der Where-Klausel filtert, ist eine andere Geschichte. Das Ergebnis ist vielleicht das selbe aber semantisch macht es einen gravierenden Unterschied und auch intern passieren unterschiedliche Dinge. Ein Optimizer versucht daher immer einen impliziten Join in einen expliziten Join zu überführen, weil dadurch die Strategie günstiger wird. So etwas sollte man im Hinterkopf haben, um das Statement schon optimal zu schreiben, weil das Parsen, Optimieren und Erstellung des Explain-Plans auch viel Zeit benötigt. Nicht umsonst finden intern weitere Caching-Strategien statt, die die SQL-Statements und deren Explain-Plan cached. Dabei werden dann Konstanten gegen Platzhalter ausgetauscht, damit der selbe Explain-Plan mit unterschiedlichen Konfigurationen ausgeführt werden kann. Das Problem war aber hier gar nicht der Join, sondern die fehlende Gruppierung ... Wieso man hier überhaupt auf den Join gekommen ist, ist mir weiterhin schleierhaft.
-
Pseudocode in den Lösungen komplett falsch?
Whiz-zarD antwortete auf Sawfare's Thema in IHK-Prüfung allgemein
Und deshalb sollte die Lösung auch richtig sein, was sie hier aber nicht ist und ich kann mir schon vorstellen, dass es für einige Prüflinge Nachteile bei der Bewertung geben wird, wenn der Prüfer sich zu sehr an der falschen Lösung orientiert. Es ist schon ein Armutszeugnis, dass die IHK es immer noch nicht schafft, fehlerfreie Prüfungen zu schreiben. Selbst zu meiner Zeit, was inzwischen schon gute 15 Jahre her ist, gab's zur Abschlussprüfung mehrere Bögen mit Korrekturen, die es nicht in den Druck geschafft haben und selbst die Korrekturen waren noch teilweise falsch ... Der Klassiker war, dass man eine Reichsnadel zur Zwischenprüfung mitbringen sollte. Gemeint war aber eine Reißnadel ... -
Der Join passiert aber implizit in der FROM-Klausel und nicht in der WHERE-Klausel...
-
Das erste ist ein sog. implizierter Join, der so nicht mehr verwendet werden sollte, da man hier ein kartesisches produkt erzeugt, welches man dann filtert. Das ist sehr langsam und sehr speicherintensiv. Explizite Joins hingegen arbeiten direkt mit den Indizes (z.B. mit dem hash Join Algorithmus) und sind somit deutlich schneller und verbrauchen auch weniger Speicher. Ein optimizer würde daher versuchen implizite joins in explizite umzuwandeln. Ein implizierter Join kann also nur ein cross Join abbilden. Für alle anderen Arten von Joins werden unterschiedliche Algorithmen verwendet. Das Resultat mag vielleicht das selbe sein. Die Ausführung aber eine völlig andere.
-
Ja, sicherlich, aber wenn man bei einem DBMS den Explain-Plan aufruft, hat man schon ein sehr gutes Indiz dafür, wie die anderen das in etwa machen. ähm, nein ... O_o Mit JOIN verbindet man zwei Tabellen zu einer Ergebnismenge und mit WHERE filtert man ... Wie willst du denn ein JOIN mit einer WHERE-Klausel abbilden?
-
Pseudocode in den Lösungen komplett falsch?
Whiz-zarD antwortete auf Sawfare's Thema in IHK-Prüfung allgemein
Leider ist das überhaupt keine Lösung, Da muss ich @Sawfare recht geben. Ich hatte mich auch gefragt, was nun "ausgaben" sein soll? Da haben sie sich wohl verschrieben, denn im Pseudocode ist von "einkommen_miete" die Rede, was plötzlich da ist. Dann darf die For-Schleife auch nicht über "AnzahlGruppe" gehen und dann indexiert auf die Mieter-Daten zugreifen. Wenn du mehr Gruppen hast, als Daten, dann fliegt dir die Anwendung um die Ohren und wenn du mehr Mieter-Daten hast, wird er nicht alle berücksichtigen. Die Lösung geht also davon aus, dass man exakt die selbe Anzahl an Gruppen und Mieter-Daten hat. Darüber hinaus ist das ein extrem schlechter Programmierstil, was die IHK hier vom Vorschein gibt und wer später so entwickelt, der gehört erschlagen. Indexiert auf Mehrdimensionale Arrays zugreifen ohne die Semantik zu kennen ist so 80er und selbst unter C würde man dafür Structs verwenden. Das ist echt schon peinlich, was die IHK dort produziert ... -
So, du müsstest dein Statement folgendermaßen ändern: SELECT a.Art_Id, a.Art_Nummer, a.Art_Bezeichnung, a.Art_Preis, SUM(r.RgPos_Menge) As MengeGesamt, COUNT(r.RgPos_Id) As Anzahl FROM Artikel a INNER JOIN RechnungsPosition r ON a.Art_Id = r.RgPos_ArtId GROUP BY a.Art_Id, a.Art_Nummer, a.Art_Bezeichnung, a.Art_Preis ; Der Grund für die Änderungen ist, dass Aggregationsfunktionen, wie z.B. COUNT, SUM, MIN, MAX, AVG nur auf Gruppierungen angewendet werden können. D.h. wir müssen Gruppen bilden. Wir bilden die Gruppen über Art_Id, Art_Nummer, Art_Bezeichnung und Art_Preis. Mit dieser Lösung haben wir aber das Problem, wenn wir eine weitere Spalte ausgeben wollen, müssen wir die Spalte auch in die Gruppierung einbeziehen. Man muss das Statement also an zwei Stellen anpassen und das finde ich persönlich nicht so toll. Man müsste sich aber mal den Explain-Plan anschauen, welche Lösung performanter ist. Das weiß ich gar nicht so richtig.
-
Darauf habe ich geantwortet : Weil dies mit ANSI SQL der beste Weg ist. Einige DBMS haben noch analytische Funktionen, mit denen man das auch noch hinbekommen kann aber die zählen wohl in der Prüfung nicht. Man könnte es auch mit ANSI SQL so hingekommen, wie du denkst, aber das wäre eher ein workaround und nicht mehr wirklich semantisch lesbar, weil man einige Annahmen treffen müsste. Die Lösung schreibe ich später noch hier rein. Ich bin gerade mit einem Smartphone unterwegs und mit code-editierungen hat mein Smartphone so einige Probleme.
-
Bis jetzt hat er noch um keine Hilfe gefragt. Die Frage lautete, ob er die volle Punktzahl bekommt. Mehr nicht und die Antwort ist Nein, aus besagten Gründen. Alles andere kann man immer noch schauen. Das muss aber vom Threadersteller selbst kommen. Der Threadersteller hat davon nichts, wenn man ihn erst mal bis zur Unterhosengröße ausquetscht und dann Informationen bekommt, nach denen er gar nicht gefragt hat.
-
Du redest aber an der Aufgabe völlig vorbei. Das Where befindet sich in einem Subselect. Das hat nichts mit einem Join zu tun. Pro Ergebniszeile werden die Subselects aufgerufen und als Filter-Kriterium wird der Wert Art_Id aus der Ergebniszeile genommen. Falls du es auch nicht so ganz mitbekommen haben solltest: Das obere Statement ist die offizielle Lösung und das untere Statement ist von @Sawfare. In der offiziellen Lösung gibt es also kein Join.
-
Wo siehst du ein Where? Das einzige Where, was ich sehe, steckt im Subselect. Das ist aber kein Join... Und selbst dafür braucht man die Aufgabe nicht ... Wie gesagt, interessant wird es erst, wenn das Statement auch ausführbar wäre. Ist es aber nicht. Folglich bekommt er nicht die volle Punktzahl. Frage beantwortet.
-
Ja, schon klar aber wie gesagt, das SQL-Statement ist nicht mal ausführbar. Da braucht man die Aufgabe nicht, um das zu erkennen. Interessant wird es erst, wenn das Statement ausführbar wäre. Außerdem kennt er die Lösung. Da braucht man ihn nun auch nicht eine Lösung vorschlagen. Den Satz verstehe ich nicht mal. Eine Where-Klausel ist kein Join. Die Where-Klausel wird in einem Subselect verwendet.
-
Und die Antwort lautet nein, weil das SQL-Statement nicht mal ausführbar ist.
-
Viel braucht man doch gar nicht verstehen. Das sind halt zwei Tabellen: Artikel und Rechnungsposition und die Tabelle Rechnungsposition ist mit der Tabelle Artikel über die Spalte Art_Id verknüpft. Mehr muss man doch nicht wissen.
-
Wird dann auch nicht funktionieren, da a.Art_Nummer, a.Art_Bezeichnung, a.Art_Preis, nicht gruppiert sind oder du die Werte nicht mit SUM, COUNT, etc. aggregierst.
-
Deine Lösung funktioniert nicht, da du kein GROUP BY angegeben hast. SUM und COUNT können nur auf Gruppen ausgeführt werden. Darum wurde in der oberen Lösung jeweils ein Subselect genommen.
-
Da reicht auch oft der gesunde Menschenverstand. Das ist eine Sache zwischen Kosten- und Nutzen. Kostet eine Software viel aber ist der Nutzen gering, dann rentiert es sich nicht. Solche Aussagen kann man auch ohne BWL-Kenntnisse aufstellen.
-
Eben. Darum würde ich es auch gar nicht so groß an die Glocke hängen, wie es hier einige tun. Man lernt vielleicht ein bisschen, was der Unterschied zwischen Haben und Soll ist und wie man eine Gewinn- und Verlustrechnung aufstellt aber das ist mehr im Stil eines kleinen Crashkurses und ist nur ein Bruchteil davon, was ein Kaufmann lernt. Dies an die große Glocke zu hängen, weil der Fachinformatiker seinen Ursprung beim Datenverarbeitungskaufmann hat, ist aus meiner Sicht ein wenig hochtrabend. Im Alltag wird man auch nicht viel damit in Kontakt kommen. Für eine Kostenaufstellung reicht auch der gesunde Menschenverstand. Außerdem wurde der Beruf Datenverarbeitungskaufmann 1997 in mehrere Berufe unterteilt. Es standen die Berufe Informatikkaufmann, IT-Systemkaufmann, Fachinformatiker und IT-Systemelektroniker. Der Fachinformatiker war also nicht als Kaufmann gedacht, sondern als praktizierender Facharbeiter. Vermutlich sind aber hier wohl einige zu jung und haben die damalige Dotcom-Blase nicht mitbekommen. Die neuen Berufe wurden nämlich damals zur Anfangszeit der Boom-Phase ins Leben gerufen.
-
Er fragte aber ob, A LEFT OUTER JOIN B nicht das selbe ist, wie B RIGHT OUTER JOIN A und ja, das ist das selbe. In beiden Fällen ist die Grundmenge A. Darum versuche ich immer als erstes die Grundmenge zu schreiben, bevor ich die Menge mit einem LEFT OUTER JOIN filtere. Das lässt sich semantisch besser lesen. Aber die Frage, ob LEFT OUTER JOIN nicht das selbe ist, wie RIGHT OUTER JOIN muss mit einem Nein beantwortet werden. Es kommt hier auf die Reihenfolge an, wie die Mengen zueinander stehen.
-
Wenn ich mal einen Knoten im Kopf habe, dann nehme ich mir immer dieses Bild als Hilfe: Das Zeigt, welche Menge man bei welchem Join bekommt. Ein Right Join benutzt man eigentlich auch recht selten. Am häufigsten sind die Inner und Left Joins. Ich selber entwickle ja auch seit fünf Jahren Stored Procedures mit PL/SQL (Eine Sprache von Oracle) und kann mich nicht daran erinnern, jemals ein Right Join gemacht zu haben. Ich versuche es immer mit einem Left Join abzubilden, weil es dann leichter zu verstehen ist. Man bildet eine Grundmenge und schränkt diese Menge mit einem Left oder Inner Join ein.
-
Programmieraufgabe/Sozialabgebenberechnunf
Whiz-zarD antwortete auf Saruto's Thema in Prüfungsaufgaben und -lösungen
Das ist gestern nur ein bisschen doof gelaufen. Eigentlich wollte ich was schreiben, klickte aber ausversehen auf den Antworten Button und kam nicht mehr dazu, den Beitrag zu erweitern. Deswegen habe ich ihn erst mal gelöscht. Ich habe mir gestern diesen Podcast angehört und frage mich, wieso man sich bei Programmieraufgaben so schwer tut? Zwei verschachtelte Schleifen sollte eigentlich jeder Prüfling hinbekommen. Das hat man in der Firma mit Sicherheit schon tausend Mal programmiert. Das, was ich hier aber sehe, ist, dass man sich in technischen Hilfsmitteln verstrickt. Anstatt das eigentliche Problem zu lösen, erzeugt man immer weitere Probleme. Als Beispiel nehme ich die o.g. Zählung der Vorkommnisse einer IP-Adresse. Selbst in Pseudocode wäre dies weniger als 10 Zeilen: Anzahl := 0 Durchlaufe alle Zeilen Zerlege Zeile in Abschnitte bei Zeichen '|' Durchlaufe alle Abschnitte IP-Adresse := Abschnitt Wenn IP-Adresse == gesuchte IP-Adresse Dann Anzahl + 1 Gebe Anzahl zurück Wie das denn hinterher in den jeweiligen Sprachen umgesetzt wird, ist doch eine andere Sache. Man erkennt aber in den wenigen Zeilen, was der Algorithmus machen soll. Wenn man aber anfängt technische Hilfskonstrukte aufzubauen, wie z.B. Zählervariablen, weil man schon im Pseudocode definiert, dass man auf das Array indexiert zugreift, ist es auch kein Wunder, warum es so schwer wird. Wie gesagt, in C# mit Linq lässt sich die komplette Aufgabe in nur einer Zeile Code lösen. Wie heißt es so schön? "In der Kürze liegt die Würze". Und genau das verstehe ich halt irgendwie nicht. Es wird halt alles so geschluckt, wie es kommt und keiner stellt die Prüfungsmethoden der IHK in Frage. Die Azubis lernen veralteten Kram, die sie nach der Abschlussprüfung gleich wieder vergessen können, verschenken lieber 25 Punkte und die Prüfer sind mit der Programmieraufgabe überfordert. Das hilft doch keinen weiter. Es ist doch für jeden von Interesse, dass hier was geändert wird. Man muss sich doch an den Kopf fassen, wenn Anwendungsentwickler ihre eigentliche Paradedisziplin in der Abschlussprüfung auslassen. -
Programmieraufgabe/Sozialabgebenberechnunf
Whiz-zarD antwortete auf Saruto's Thema in Prüfungsaufgaben und -lösungen
gelöscht -
Programmieraufgabe/Sozialabgebenberechnunf
Whiz-zarD antwortete auf Saruto's Thema in Prüfungsaufgaben und -lösungen
Leider habe ich kein Überblick, wie die Fragen im Allgemeinen gestellt wird. Vielleicht irre ich mich da auch. Meine Zeit als Azubi liegt auch ein bisschen zurück und ich hab damals nur eine Ausbildung zum Mechatroniker gemacht aber in meiner Abschlussarbeit kam eine Aufgabe zur SPS-Programmierung vor und wenn ich mich noch recht erinnere ging es um eine Programmierung einer Maschine, die Kugeln nach ihrer Farbe sortieren soll. Zumindest fand ich damals die Aufgabe sehr einfach. Auch in meiner Ausbildung aus Assistent für Medieninformatik kamen Programmier-Klausuren vor, wo man für einen Algorithmus 20 Minuten Zeit hatte. Da ging es u.a. darum, zu prüfen, ob ein String ein Palindrom ist, mit der Berücksichtigung, dass Groß- und Kleinschreibung und Satzzeichen ignoriert werden sollen etc. Auch das war machbar. Die IHK wird ja keine unmögliche Aufgabe in die Abschlussprüfung packen. Außerdem wird man ja ein paar Ideen haben, wie man mit der Aufgabe anfangen kann. Das gibt ja schon ein paar Punkte. Wenn ich mir dann auch noch diesen Thread anschaue, wo offenbar eine Aufgabe aus einer Abschlussprüfung stammt, ist das jetzt nun auch kein Hexenwerk. Laut Struktogramm sind das lediglich nur zwei verschaltete Schleifen. Ich hab mir das Struktogramm genommen und mal in C# umgesetzt. Wenn ich das Struktogramm jetzt richtig verstanden habe (ich verstehe nicht, warum die Anzahl der IP-Adressen pro Zeile auf 4 beschränkt wird), war das jetzt eine Zeile Code. int count = zeilen.SelectMany(zeile => zeile.Split('|')).Count(ipAddress => ipAddress == searchIpAddress); -
Programmieraufgabe/Sozialabgebenberechnunf
Whiz-zarD antwortete auf Saruto's Thema in Prüfungsaufgaben und -lösungen
Man bekommt aber Teilpunkte für die Aufgaben und für einen Anwendungsentwickler sind das leichtverdiente Punkte. Diese Aufgaben grundsätzlich auszulassen halte ich für falsch. Dann schreibe bitte den Text auch so. Du suggierierst den Leser, dass Pseudocode auch im Alltag verwendet wird: Und das ist schlichtweg falsch. Wer etwas "runterprogrammiert" hat schon automatisch einen schlechten Programmierstil. Man muss hier auch bedenken, dass man es bei der Abschlussprüfung nicht mit absoluten Neuanfängern zu tun hat, sondern eigentlich schon ausgebildete Fachkräfte, die nur noch in der Abschlussprüfung ihr Können unter Beweis stellen sollen. Wir haben es hier also nicht mit Hobby-Hackern zu tun, die man mit Samthandschuhen anfassen muss, sondern mit Menschen, die damit ihr tägliches Brot verdienen wollen und da verlange ich schon eine gewisse Professionalität. Sicherlich, mein Code sah direkt nach der Ausbildung auch nicht so aus, wie jetzt, denn das kommt erst mit zunehmender Erfahrung aber den Prüflingen was falsches zu vermitteln, halte ich für kontraproduktiv. Man kann den Prüflingen ja darauf hinweisen, dass die IHK eine veraltete Vorstellung hat und dass man deswegen lieber auf Pseudocode setzen sollte, weil es schneller, nicht standardisiert und sprachenunabhängig ist aber denen damit eine zeitgemäße Entwicklung vorzugaukeln und sie so zubehandeln als seinen sie noch im ersten Lehrjahr halte nicht für richtig. Man sollte schon das Kind beim Namen nennen und auch die Dinge kritisch betrachten und sie nicht einfach hinnehmen. Nur so kann man auch was erreichen. -
Programmieraufgabe/Sozialabgebenberechnunf
Whiz-zarD antwortete auf Saruto's Thema in Prüfungsaufgaben und -lösungen
Ich will dir nicht zu nahe treten aber ernsthaft? O_o Du machst eine dreijährige Ausbildung zum Anwendungsentwickler und gerade deine Paradedisziplin in der Abschlussprüfung würdest du lieber auslassen wollen? Darf ich dann fragen, was du in den letzten drei Jahren gemacht hast? Wenn, dann würde ich auch Pseudocode schreiben, denn Diagramme verbrauchen zu viel Zeit. In Prüfungen, wo man nicht vor der Maschine sitzt, macht Pseudocode Sinn, weil der Code eh nicht wirklich lang wird, aber ich würde diesem Code keine allzu große Aufmerksamkeit schenken, denn Pseudocode ist entgegen der Behauptung in diesem Text: ebenfalls nicht mehr zeitgemäß und im alltäglichen Berufsleben wird man auch nie mehr Pseudocode schreiben. Als Softwareentwickler sitzt man dann eh vor seinem Gerät und kann seinen Code zum Ausprobieren in die Maschine hacken. Pseudocode auf Papier ist dann nicht mehr erforderlich. Pseudocode ist auch keine brauchbare Dokumentation, denn erstens interessiert sich der Aufrufer nicht für die dahinterstehende Implementierung und zweitens sollte ein Code schon so sauber geschrieben werden, sodass keine weitere Dokumentation für die Beschreibung der Implementierung des Algorithmus benötigt wird. Wozu sollte so eine Dokumentation auch nützlich sein? Ein Softwareentwickler kann auch den Quellcode lesen. Da braucht man kein Pseudocode. Bestimmte Konstrukte, wie z.B. for-schleifen, verwendet man auch im Alltag nur noch sehr selten. Auch Arrays kommen nicht mehr so häufig explizit zum Einsatz, denn zu über 90% wird man nur durch die Elemente iterieren, da bieten sich dann eher Iteratoren an, anstatt eine Indexierungsvariable, um besseren und lesbaren Code zu schreiben. Ich selber kann mich auch gar nicht mehr daran erinnern, wann ich zuletzt eine for-Schleife geschrieben habe. Pseudocode sorgt auch, meiner Meinung nach, für einen schlechten Programmierstil, da man alles in Spaghetticode runterschreibt und wenn man doch den Pseudocode in Methoden aufteilt, dann wird es auch schnell komplexer und dann hätte man den Code auch selbst in die Maschine hacken können. Das selbe gilt auch für die im Text erwähnten Switch-Anweisungen. Switch-Anweisungen an falschen stellen erhöhen deutlich die zyklomatische Komplexität. Man sollte sie also mit Vorsicht genießen oder sie sogar eher vermeiden. Switch-Anweisungen verwende ich eigentlich eher nur noch für Factory-Methoden. Aber auch nur dann, wenn ich weiß, dass diese Methode nie mehr angefasst wird und es auch nicht zu viele Abzweigungen gibt. Wenn eine Firma sogar TDD (test-driven development) anwendet, wird man eh im ersten Schritt erst eine geeignete Schnittstelle ausdenken und gegen diese Schnittstelle ein Test schreiben und erst dann über eine konkrete Implementierung nachdenken.