Laden...

Problem mit einem SQL - Query (einfach)

Erstellt von Ishildur vor 17 Jahren Letzter Beitrag vor 17 Jahren 9.870 Views
Thema geschlossen
I
Ishildur Themenstarter:in
431 Beiträge seit 2005
vor 17 Jahren
Problem mit einem SQL - Query (einfach)

Hallo zusammen
Ich habe folgende an sich sehr einfach Situation:
Ich habe eine Master (Person) und eine Detail (Contact) Tabelle

Nun möchte ich ein Select auf die Mastertabelle anwenden und dabei noch ein Feld des ersten zugehörigen Datensatz aus der Child in der Masterrow einfügen.

Bsp.

Person:
1 Hofer Verena
2 Gerber Andrea

Contact:
1 1 033 / 655 00 89
2 1 034 / 345 89 32
3 2 089 / 234 34 56
4 2 078 / 233 45 34

Ergebnis:
Hofer Verena 033 / 655 00 89
Gerber Andrea 089 / 234 34 56

Wie muss dann dass Select Statement aussehen?

D
496 Beiträge seit 2005
vor 17 Jahren

wie wärs mir

SELECT person.name, person.vorname, contact.nummer
FROM person INNER JOIN contact ON person.ID = contact.ID

?

"Programming is similar to sex. If you make a mistake, you have to support it for the rest of your life."

I
1.739 Beiträge seit 2005
vor 17 Jahren

Die Abrage ist ein einfacher Join. Ein Beispiel kam ja schon. Falls du noch das dazugehörige DB(M)S dazupostest, könnten die Beispiele auch auf Performance rücksichtnehmen.
Negatives Beispiel(fast überall:
SELECT a.name, a.vorname, b.nummer
FROM person a , contact b in (select b.nummer from b)

I
Ishildur Themenstarter:in
431 Beiträge seit 2005
vor 17 Jahren

Das verstehe ich jetzt irgendwie nicht so...
Naja, bin nicht gerade der SQL - GURU

Vielleicht habe ich mich etwas falsch ausgedrückt:
Ich habe bspw. 10 Personen, welchen je 5 Kontakte zugeordnet sind. Also insgesammt 50 Kontakte. Nun möchte ich, dass 10 Zeilen mit je einem der Kontakte ausgelistet wird. Dabei soll auch jeweils der erste zugehörige Kontakt ausgedruckt werden.

D
496 Beiträge seit 2005
vor 17 Jahren

wie jetzt?du willst nur einen kontakt pro person angezeigt haben? wieso trägst du dann mehrere ein?

zeig doch mal ein bischen von deiner tabellen stuktur und was du genau als ergebniss haben willst ich glaub ich hab deine ergebniss tabelle falsch interpretiert

"Programming is similar to sex. If you make a mistake, you have to support it for the rest of your life."

I
Ishildur Themenstarter:in
431 Beiträge seit 2005
vor 17 Jahren

Naja, im Grid soll nur einer angezeigt werden. Wenn man dann auf die Zeile Doppelklickt, erscheinen dann schon alle! 😁

D
496 Beiträge seit 2005
vor 17 Jahren

aha und wie sollen diesen dann angezeigt werden? in einer combobox oder wie stellst du dir das vor?

dann brauchst du zwei queries eine die dein grid füllt und eine die deine combobox füllt.

"Programming is similar to sex. If you make a mistake, you have to support it for the rest of your life."

I
Ishildur Themenstarter:in
431 Beiträge seit 2005
vor 17 Jahren

Diese werden in einem weiteren DataGridView angezeigt...

I
Ishildur Themenstarter:in
431 Beiträge seit 2005
vor 17 Jahren

Aber wir schweifen ab...

I
1.739 Beiträge seit 2005
vor 17 Jahren

Naja, im Grid soll nur einer angezeigt werden. Wenn man dann auf die Zeile Doppelklickt, erscheinen dann schon alle!

Soll jetzt heissen?
Einfach nur die passende Auswahl? Das hat dann aber wenig(fast nichts) mit Master-Detail zu tun.
Das sind zwei unterschiedliche Abfragen, Abfrage 2 wäre nur die Wertliste für einen Eintrag in 1.
Also kein Join oder schlimmeres, nur eine Liste gewollter Einträge(Bsp: Anrede: Herr, Frau, Sonstiges).

I
Ishildur Themenstarter:in
431 Beiträge seit 2005
vor 17 Jahren
I
1.739 Beiträge seit 2005
vor 17 Jahren

@Ishildur:
>Diese werden in einem weiteren DataGridView angezeigt...

RowChange = neue Abrage für DGV 2?
(wär vielleicht ein Ansatz, oder alle Daten Präventiv laden? Geht auch, Wär dann nur ein Umsetzen des Filters von DV2(einmal Laden, Filtern so oft man mag).
Möglicherweise entsteht ein Problem in der Aktualität der Daten, dafür gibts noch nicht "den" Automatismus.

I
Ishildur Themenstarter:in
431 Beiträge seit 2005
vor 17 Jahren

@Ikaros
Ja, das ist mir alles schon klar. Aber die eigentliche Frage war, ob man diese Abfrage in einem TSQL - Query machen kann?

I
1.739 Beiträge seit 2005
vor 17 Jahren

Original von Ishildur
@Ikaros
Ja, das ist mir alles schon klar. Aber die eigentliche Frage war, ob man diese Abfrage in einem TSQL - Query machen kann?

Falls du eine SP meinst? Selbstverständlich, geht auch fixer.

I
Ishildur Themenstarter:in
431 Beiträge seit 2005
vor 17 Jahren

SP ?(

I
1.739 Beiträge seit 2005
vor 17 Jahren

SP?
Entschuldige die Abkürzung.
SP = Stored Procedure
Also Serverseitig(DB). SP's sind immer schneller und teilweise sicherer(Aufruf per Parameter).
Vereinfacht gesagt: Deine Abfrage DB-Seitig kompiliert und parametrisierbar(Where-Klausel z.B), das Ding ist quasi fertig(die DB ist immer schneller asl ihr Client(logisch weil für den Spezialbereich optimiert)). Also eine Abfrage die vorgefertigt im DBMS vorliegt. Ich hoffe mich mich einigermassen verständlich ausgedrückt zu haben(falls nicht leg dein Veto ein, dann versuch ichs nochmal, oder ein anderer kanns besser)

I
Ishildur Themenstarter:in
431 Beiträge seit 2005
vor 17 Jahren

Ach so, OK
Naja, ich verwende keine Stored Procedures, weil die Applikation unter Umständen auch unter anderen Datenbanken wie mySQL laufen muss, welche keine SP's unterstützen oder Firebird, welche eine stark andere Synthax aufweisen.

Gehts denn auch ohne SP's ? Ist egal, wenn das Query etwas komplizierter wird.
Wie beispielsweise das Query für die Purchase Table...


// define the select - command
   String strCmd = "SELECT SessionProduct_ID,Ses.Session_ID AS Session_ID,Prd.Name AS Product,";
   strCmd += "Cat.Name AS Category,Man.Name as Manufacturer,CAST(Spr.Price AS VARCHAR)+' sFr.'";
   strCmd += "AS Price,Prd.Quantity AS Quantity,Prd.QuantityType AS QuantityType, ";
   strCmd += "Emp.Name AS Employee,Ses.SessionDate AS SessionDate,Prs.PersonalName+' '+";
   strCmd += "Prs.FamilyName AS Person FROM SessionProduct AS Spr ";
   strCmd += "LEFT JOIN Product AS Prd ON Spr.Product_ID = Prd.Product_ID ";
   strCmd += "LEFT JOIN Category AS Cat ON Prd.Category_ID = Cat.Category_ID ";
   strCmd += "LEFT JOIN Manufacturer AS Man ON Prd.Manufacturer_ID = Man.Manufacturer_ID ";
   strCmd += "LEFT JOIN Employee AS Emp ON Spr.Employee_ID = Emp.Employee_ID ";
   strCmd += "RIGHT JOIN Session AS Ses ON Spr.Session_ID = Ses.Session_ID ";
   strCmd += "RIGHT JOIN Person AS Prs ON Ses.Person_ID = Prs.Person_ID";
   this.SelectCommand.CommandText = strCmd;

I
1.739 Beiträge seit 2005
vor 17 Jahren

Ähm,
TSQL - Query
TSQL ist MS-SQLServerspezifisch, bei Oracle gibts PL-SQL. Ja und stimmt, es gibt dafür keine Standards. Bei MySql bin ich mir nicht sicher zu Storeed Procedures(nicht mein Gebiet), aber z.B: Trigger gibts.
Falls das mit den u.U. ernst ist würde ich an deiner Stelle DAL-Klassen aufbauen(nur falls mehr als eine DB infrage kommt). Aber nur falls es wirklich dringlich und wichtig ist(für ne Einmalanwendung echt rausgeschmissene Ressourcen).

170 Beiträge seit 2005
vor 17 Jahren

Also eigentlich ist das große Argument FÜR SPs ja gerade die Inkompatibilität
der Datenbanken. Es brauchen letztlich nur die SPs auf den DBs angepasst
werden und der Rest läuft ohne Anpassung automatisch - die perfekte
Abstraktion ohne größeren Aufwand.

MySQL unterstützt seit 5.x ebenfalls SPs.

I
1.739 Beiträge seit 2005
vor 17 Jahren

Wo du recht hast...
Nein: Performance ist das plus(und Featuaritis), und da ist Kompatibilität weniger gefragt...

I
Ishildur Themenstarter:in
431 Beiträge seit 2005
vor 17 Jahren

@Alle

Ich habe die Lösung nun selbst gefunden, möchte mich nun aber vergewissern, dass der Befehl korrekt ist, da ich wie gesagt nicht so ein GURU bin:

select PersonalName,FamilyName,Adress,(select Top 1 Content from Contact where Contact.Person_ID = Person.Person_ID) AS Kontakt from Person;

I
Ishildur Themenstarter:in
431 Beiträge seit 2005
vor 17 Jahren

Das komplette Query sieht dann folgendermassen aus:


   // define the general select - command
   String strCmd  = "SELECT Person_ID,Title,PersonalName,FamilyName,Adress,Zip,Place,";
   strCmd += "Country.Name AS Country,(SELECT TOP 1 Content FROM Contact WHERE ";
   strCmd += "Contact.Person_ID = Person.Person_ID AND Media = 0) AS Contact FROM Person ";
   strCmd += "LEFT JOIN Country ON Person.Country_ID = Country.Country_ID";
   this.SelectCommand.CommandText = strCmd;

96 Beiträge seit 2006
vor 17 Jahren
ähnlich

Ich habe ein ähnliches Problem und zwar,...

...ich möschte auslesen, welche ID die ausgewählte Zeile hat und diese dann in:

OdbcCommand command = new OdbcCommand("DELETE FROM CodesetBezeichnung WHERE ID = ?", connection);

(da wo das Fragezeichen is) schreiben.

Teamarbeit ist, wenn vier Leute für eine Arbeit bezahlt werden, die drei besser machen könnten, wenn sie nur zu zweit gewesen wären und einer davon krank zu Bett läge.
N
4.644 Beiträge seit 2004
vor 17 Jahren

Wie schon TAUSENDE Male gesagt. Stelle Deine Fragen GENAUER!

Wo willst Du was auslesen?
Falls Dir mal niemand mehr antwortet, finde den Fehler bei Dir!

96 Beiträge seit 2006
vor 17 Jahren

Also...

Ich habe ein DataGridView, in diesem steht etwas mit der Spaltenüberschrift "ID" wenn der Benutzer dies Ausgewählt hat (angelickt) und drückt löschen dann soll ausgelesen werden, Welche Zeile bzw. welche ID und dann soll die gelöscht werden. Mein Ansatz bis jetzt ist:

private void btnLöschen_Click(object sender, EventArgs e)
        {
            
            string strMeldung = "Wollen Sie den ausgewählten Datensatz wirklich löschen?";
            DialogResult result = MessageBox.Show(strMeldung,
                            Application.ProductName,
                            MessageBoxButtons.YesNo,
                            MessageBoxIcon.Question,
                            MessageBoxDefaultButton.Button2);
            if (result == DialogResult.Yes)
            {
                try
                {
                    OdbcConnection connection = null;
                    connection = new OdbcConnection(@"DSN=areaControl;Trusted_connection=Yes");
                    connection.Open();
                    OdbcCommand command = new OdbcCommand("DELETE FROM CodesetBezeichnung WHERE ID = ?", connection);
                    command.ExecuteNonQuery();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
                    throw;
                }
            }
        }

Anstelle des Fragezeichens soll jetzt aber die Ausgewählte ID stehen.
Wie ist das Realisierbar bzw ist das überhaupt realisierbar?

Teamarbeit ist, wenn vier Leute für eine Arbeit bezahlt werden, die drei besser machen könnten, wenn sie nur zu zweit gewesen wären und einer davon krank zu Bett läge.
484 Beiträge seit 2006
vor 17 Jahren

Original von HIZ

OdbcCommand command = new OdbcCommand("DELETE FROM CodesetBezeichnung WHERE ID = ?", connection);  

Zumindest hast Du schon mal rausgefunden das man die Connection im Konstruktor hinzufügen kann 🙂

Jetzt musst Du nur noch rausfinden wie man dem ODBC-Command einen Parameter mitgibt.

OdbcCommand command = new OdbcCommand("DELETE FROM CodesetBezeichnung WHERE ID = @DeineId", connection

Jörg

96 Beiträge seit 2006
vor 17 Jahren
So??????????????????????????????????????

?( 🤔

private void btnLöschen_Click(object sender, EventArgs e)
        {
            
            string strMeldung = "Wollen Sie den ausgewählten Datensatz wirklich löschen?";
            DialogResult result = MessageBox.Show(strMeldung,
                            Application.ProductName,
                            MessageBoxButtons.YesNo,
                            MessageBoxIcon.Question,
                            MessageBoxDefaultButton.Button2);
            if (result == DialogResult.Yes)
            {
                try
                {                    
                    OdbcConnection connection = null;
                    connection = new OdbcConnection(@"DSN=areaControl;Trusted_connection=Yes");
                    connection.Open();
                    String SelID = "SELECT ID";
                    OdbcCommand salesCommand = new OdbcCommand("SalesByCategory", connection);
                    salesCommand.CommandType = CommandType.StoredProcedure;
                    OdbcParameter param = salesCommand.Parameters.Add("@SelID", OdbcType.NVarChar, 15);
                    OdbcCommand command = new OdbcCommand("DELETE FROM CodesetBezeichnung WHERE ID = @SelID", connection);
                    command.ExecuteNonQuery();                    
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
                    throw;
                }
            }
        }

🤔 ?(

Teamarbeit ist, wenn vier Leute für eine Arbeit bezahlt werden, die drei besser machen könnten, wenn sie nur zu zweit gewesen wären und einer davon krank zu Bett läge.
N
4.644 Beiträge seit 2004
vor 17 Jahren

Was war jetzt nochmal Deine Frage?
Das DataGridView hat eine Eigenschaft SelectedRows, dass sollte reichen.

96 Beiträge seit 2006
vor 17 Jahren
?

Ich habe jetzt einiges Ausprobiert und bin zu dem Entschluss gekommen: i hab keine ahnung wie!

private void btnLöschen_Click(object sender, EventArgs e)
        {
            
            string strMeldung = "Wollen Sie den ausgewählten Datensatz wirklich löschen?";
            DialogResult result = MessageBox.Show(strMeldung,
                            Application.ProductName,
                            MessageBoxButtons.YesNo,
                            MessageBoxIcon.Question,
                            MessageBoxDefaultButton.Button2);
            if (result == DialogResult.Yes)
            {

                try
                {
                    OdbcConnection connection = null;
                    connection = new OdbcConnection(@"DSN=areaControl;Trusted_connection=Yes");
                    connection.Open();
                    //String SelID = "4";
                    //OdbcCommand salesCommand = new OdbcCommand("SalesByCategory", connection);
                    //salesCommand.CommandType = CommandType.StoredProcedure;
                    //OdbcParameter param = salesCommand.Parameters.Add("@SelID", OdbcType.Int, 3).Value = 5;
                    //param.Value = 5;
                    OdbcCommand Command = new OdbcCommand("DELETE FROM CodesetBezeichnung WHERE ID = 5", connection);
                    Command.ExecuteNonQuery();
                    //Command.Parameters.Add("?SelID", OdbcType.Int, 3).Value = 5;
                    //OdbcCommand salesCommand = new OdbcCommand("
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
                    throw;
                }
                /*
                    string queryString = "SELECT * FROM Table1 WHERE Field1 LIKE ?";
                    OleDbCommand command = new OleDbCommand(queryString, connection);
                    command.Parameters.Add("@p1", OleDbType.Char, 3).Value = "a";
                    OleDbDataReader reader = command.ExecuteReader();
                */
            }
        }

So siehts jetzt aus!

Teamarbeit ist, wenn vier Leute für eine Arbeit bezahlt werden, die drei besser machen könnten, wenn sie nur zu zweit gewesen wären und einer davon krank zu Bett läge.
N
4.644 Beiträge seit 2004
vor 17 Jahren

Ich sehe nirgends, dass Du auch nur einmal die Aussage mit den SelectedRows berücksichtigt hast. Diese wurde Dir auch schon in anderen Threads genannt. Da Du noch niemals Eigeninitiative gezeigt hast und ich davon ausgehe, dass dies in diesem Thread auch nicht geschieht schließe ich ihn.

Es wurde alles genannt um Dein Problem zu lösen. Aber es wird Dir kein kompletter Code geschrieben, dass musst Du selbst tun!

Closed!

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo HIZ,

da dies nun leider schon der zweite Thread ist, der wegen ausufernder und unnötiger Nachfragen geschlossen werden musste, bitten wir dich, zukünftigen Nachfragen - die grundsätzlich weiterhin willkommen sind - nur zu stellen, wenn du wirklich intensiv die vorhandenen Antworten berücksichtigt hast und dich - auch mit Hilfe weiterer Quellen, wie Wikipedia, Google, Forumssuche und Büchern - ernsthaft um eine selbständige Lösung des Problems bemüht hast und dies in der Nachfrage auch zu erkennen ist.

herbivore

Thema geschlossen