Abfrage über 2 Tabellen

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Mono.

    Abfrage über 2 Tabellen

    Hallo zusammen, ich komme nicht weiter mit einer Abfrage.

    Aufbau:
    1 x Tabelle1 mit einer Spalte "id_anlage", "bezeichnung" und "einsatz"
    In der Spalte einsatz stehen Zahlen von 1-9

    1 x Tabelle2 mit "ID", "id_anlage", "datum"

    Nun brauche ich folgende Abfrage:

    Ich würde gerne alle Datensätze von Tabelle 1 ausgeben, wenn:
    -Wenn die id_anlage in der Tabelle2 nicht mehr als die Zahl "einsatz" der Tabelle 1 vorkommt und ds datum von einsatz sollte in diesem Jahr sein.


    Abfrage kriterien
    - datum von Tabelle 2 zwischen 01.01.2016 und 31.12.2016
    - die Anlage soll nur ausgegeben werden wenn die anlagen_id in Tabelle2 nicht öfters steht als die Zahl in Tabelle1 under einsatz.

    Hoffe ich konnte das verständlich erläutern. Andernfalls dürft ihr gerne nachfragen.

    Gruss Schnibli
    Ahoi,

    versuch es doch mal so (ich gehe mal von MSSQL aus)

    SQL-Abfrage

    1. SELECT *
    2. FROM tabelle1 as t1 JOIN tabelle2 as t2 ON t1.id_anlage = t2.id_anlage
    3. WHERE
    4. t2.datum > CONVERT(datetime, '2016-01-01 00:00:00.000') AND t2.datum < CONVERT(datetime, '2016-12-31 00:00:00.000')
    5. --Je nach dem, wie dein Datum in der DB aussieht
    6. AND
    7. (SELECT COUNT(x.id_anlage) FROM tabelle2 as x WHERE x.id_anlage = t2.id_anlage) <= t1.einsatz

    Um dir aber nicht nur die Lösung hin zu werfen, noch der Tipp: Schau dir mal Korrelierte Subqueries an
    Grüße Manu

    Was Gott dem Menschen erspart hat, kann der Computer.
    Billy ©, (*1932), Schweizer Aphoristiker
    Quelle: www.Aphorismen.de
    so hab alles angepasst:

    Quellcode

    1. SQL = "SELECT *
    2. FROM tblAnlagenNr as t1 JOIN tblAlgemeinEinsaetze as t2 ON t1.AnlagenNr = t2.AnlagenNr
    3. WHERE
    4. t2.Datum > CONVERT(datetime, '2016-01-01') AND t2.Datum < CONVERT(datetime, '2016-12-31')
    5. AND
    6. (SELECT COUNT(x.AnlagenNr) FROM tabelle2 as x WHERE x.AnlagenNr = t2.AnlagenNr) <= t1.anzahl_service"
    7. anlagendatenbankCommand.Connection = MysqlConn
    8. anlagendatenbankCommand.CommandText = SQL
    9. anlagendatenbankAdapter.SelectCommand = anlagendatenbankCommand
    10. anlagendatenbankAdapter.Fill(Me.Anlagendatenbank_data_set_mysql.tblAnlagenNr)
    11. End Sub


    Nun habe ich den Fehler:

    Quellcode

    1. Ein Ausnahmefehler des Typs "MySql.Data.MySqlClient.MySqlException" ist in MySql.Data.dll aufgetreten.
    2. Zusätzliche Informationen: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''2016-01-01') AND t2.Datum < CONVERT(datetime, '2016-12-31')

    Wie muss ich dies Formatieren wenn ich in der db
    Datum = Date habe:

    Quellcode

    1. SQL = "SELECT *
    2. FROM tblAnlagenNr as t1 JOIN tblAlgemeinEinsaetze as t2 ON t1.AnlagenNr = t2.AnlagenNr
    3. WHERE
    4. t2.Datum > CONVERT('2016-01-01',date) AND t2.Datum < CONVERT('2016-12-31',date)
    5. AND
    6. (SELECT COUNT(x.AnlagenNr) FROM tblAlgemeinEinsaetze as x WHERE x.AnlagenNr = t2.AnlagenNr) <= t1.anzahl_service"

    so nun passt ess, jedoch habe ich im dataset "Tabelle tblAnlagenNr" keine Datensätze... ich glaub es liegt an der datatable.
    Kann ich dies direkt in ein dgv laden?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „schnibli“ ()

    Hast du die Abfrage schon direkt im MySQL getestet? Kommen auch wirklich Ergebnisse zurück?
    Grüße Manu

    Was Gott dem Menschen erspart hat, kann der Computer.
    Billy ©, (*1932), Schweizer Aphoristiker
    Quelle: www.Aphorismen.de
    Hallo nun hatte ich wieder zeit um das auszuprobieren.

    Wenn ich direkt bei Heidi den befehl:

    SQL-Abfrage

    1. SELECT *
    2. FROM tblAnlagenNr as t1 JOIN tblAlgemeinEinsaetze as t2 ON t1.AnlagenNr = t2.AnlagenNr
    3. WHERE
    4. t2.Datum > CONVERT('2016-01-01',date) AND t2.Datum < CONVERT('2016-12-31',date)
    5. AND
    6. (SELECT COUNT(x.AnlagenNr) FROM tblAlgemeinEinsaetze as x WHERE x.AnlagenNr = t2.AnlagenNr) <= t1.anzahl_service

    eingebe, finder erkeinen Datensatz (obwohl anzahl_service 5 ist und es nur einen Eintrag hat.

    wenn ich nun

    SQL-Abfrage

    1. SELECT *
    2. FROM tblAnlagenNr as t1 JOIN tblAlgemeinEinsaetze as t2 ON t1.AnlagenNr = t2.AnlagenNr
    3. WHERE
    4. t2.Datum > CONVERT('2016-01-01',date) AND t2.Datum < CONVERT('2016-12-31',date)

    eingebe, findet er den einen eintrag. also bis hier hin funktioniert es :)

    kann mir jemand helfen :S

    So das Problem ist, dass er alle einsätze zählt und nicht nur diejenigen von diesem jahr (sobald ich: AND

    Quellcode

    1. (SELECT COUNT(x.AnlagenNr) FROM tblAlgemeinEinsaetze as x WHERE x.AnlagenNr = t2.AnlagenNr) < t1.anzahl_service[code]​
    [/code] in die abfrage hinzufüge)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „schnibli“ ()

    Dann füge beim Count noch die Datums Where Klauseln hinzu.

    Aber ich würde es ganz anders machen.

    SQL-Abfrage

    1. SELECT *
    2. FROM tblAnlagenNr as t1 JOIN
    3. (SELECT COUNT(*) as Count, AnlagenNr from tblAlgemeinEinsaetze where Datum > CONVERT('2016-01-01',date) AND Datum < CONVERT('2016-12-31',date) GROUP BY AnlagenNr) as t2 ON t1.AnlagenNr = t2.AnlagenNr
    4. WHERE t2.Count <= t1.zahl_service
    Das ist meine Signatur und sie wird wunderbar sein!
    Mit deiner Idee Funktioniert es eigentlich, nur:
    Wenn anzahl_service = 1 ist und noch kein Datensatz mit der AnlagenNr in Tabelle 2 ist, wird diese auch nicht angezeigt :s

    Quellcode

    1. ​SELECT *
    2. FROM tblAnlagenNr as t1 JOIN
    3. (SELECT COUNT(*) as Count, AnlagenNr from tblAlgemeinEinsaetze where Datum > CONVERT('2016-01-01',date) AND Datum < CONVERT('2016-12-31',date) GROUP BY AnlagenNr) as t2 ON t1.AnlagenNr = t2.AnlagenNr
    4. WHERE t2.Count < t1.anzahl_service
    Ach das kann auch sein? Das gar keine Einträge vorhanden sind..
    Dann muss man es mit einem LEFT JOIN machen und den Count mit IFNULL bei MySQL oder ISNULL bei MS SQL vergleichen oder auf kleiner als oder NULL.
    Vielleicht bleibst dann bei der ersten Methode und fügst eben nur die Datumsabfrage mit in das WHERE bei dem Count Query.

    Ansonsten so:

    SQL-Abfrage

    1. SELECT *
    2. FROM tblAnlagenNr as t1 LEFT JOIN
    3. (SELECT COUNT(*) as Count, AnlagenNr from tblAlgemeinEinsaetze where Datum > CONVERT('2016-01-01',date) AND Datum < CONVERT('2016-12-31',date) GROUP BY AnlagenNr) as t2 ON t1.AnlagenNr = t2.AnlagenNr
    4. WHERE t2.Count < t1.anzahl_service or t2.count IS NULL -- hier ginge auch IFNULL(t2.count,0) < t1.anzahl_service


    Ich habe keine Ahnung was du mit "Es klappt nur, wenn anzahl_service = 1 ist" meinst. Das glaub ich eigentlich nicht.
    Das ist meine Signatur und sie wird wunderbar sein!