none
Alle Datensätze einer Tabelle wenn in andere Tabele ein Eintrag besteht RRS feed

  • Frage

  • Halloo zusammen,

    ich habe irgendwie gerade Bretter vor dem Kopf und komme nicht auf den korrekten Select.

    In einer Tabelle sind Maschinen-Typen aufgeführt, in der anderen Tabelle die Maschinen mit dem Maschinen-Typ. Jetzt möchte ich die Maschinen-Typen auflisten, für die keine entsprechenden Einträge von in der Tabelle der Maschinen existieren, also der Count = 0 ist.

    Irgendwie komme ich nicht auf die Lösung und würde Euch bitten mir bitte auf die Sprünge zu helfen, wäre Euch echt dankbar dafür.

    Viele Grüsse,
    Maxi

    Dienstag, 5. April 2011 19:03

Antworten

  • Hallo Maxi,

    das kann man mit einer NOT IN Subselect Abfrage lösen oder mit einer NOT EXISTS Abfrage lösen.

    Bei der NOT IN Abfrage muss man nur darauf achten, das das Subselect keine NULL Werte zurück liefert, sonst schlägt die Prüfung immer fehl. Beispiel:

    SELECT *

    FROM MaschinenTypen AS MT

    WHERE NOT MachinenType_ID IN

          (SELECT ID

           FROM Machinen

           WHERE NOT ID IS NULL)

     


    Olaf Helper
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich
    Blog Xi
    Dienstag, 5. April 2011 19:22
  • Hi,

    da Du leider die Tabellenstruktur nicht gepostet hast, hier ein Beispiel:

    SELECT TypId, TypName
    FROM  MaschinenTypen
    WHERE  TypId NOT IN ( SELECT DISTINCT MaschinenTyp FROM Maschinen )
    
    


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
    Dienstag, 5. April 2011 19:23
    Moderator
  • hi,

    du hast folgende drei Möglichkeiten:

    USE AdventureWorksLT ;
    
    SET STATISTICS IO ON;
    
    SELECT A.*
    FROM  SalesLT.Address A
        LEFT OUTER JOIN SalesLT.SalesOrderHeader SOH ON SOH.ShipToAddressID = A.AddressID
    WHERE  SOH.SalesOrderID IS NULL ;
    
    SELECT A.*
    FROM  SalesLT.Address A
    WHERE  NOT A.AddressID IN ( SELECT SOH.ShipToAddressID
                   FROM  SalesLT.SalesOrderHeader SOH ) ;
        
    SELECT A.*
    FROM  SalesLT.Address A
    WHERE  NOT EXISTS ( SELECT 1
               FROM  SalesLT.SalesOrderHeader SOH
               WHERE SOH.ShipToAddressID = A.AddressID ) ;
    
    
    Wichtig ist, das du dir immer den aktuellen Ausführungsplan und die IO-Statisitk ansiehst. In obigem Fall ist also die erste Möglichkeit zu bevorzugen.


    Microsoft MVP Office Access
    https://mvp.support.microsoft.com/profile/Stefan.Hoffmann
    Montag, 11. April 2011 11:05

Alle Antworten

  • Hallo Maxi,

    das kann man mit einer NOT IN Subselect Abfrage lösen oder mit einer NOT EXISTS Abfrage lösen.

    Bei der NOT IN Abfrage muss man nur darauf achten, das das Subselect keine NULL Werte zurück liefert, sonst schlägt die Prüfung immer fehl. Beispiel:

    SELECT *

    FROM MaschinenTypen AS MT

    WHERE NOT MachinenType_ID IN

          (SELECT ID

           FROM Machinen

           WHERE NOT ID IS NULL)

     


    Olaf Helper
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich
    Blog Xi
    Dienstag, 5. April 2011 19:22
  • Hi,

    da Du leider die Tabellenstruktur nicht gepostet hast, hier ein Beispiel:

    SELECT TypId, TypName
    FROM  MaschinenTypen
    WHERE  TypId NOT IN ( SELECT DISTINCT MaschinenTyp FROM Maschinen )
    
    


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
    Dienstag, 5. April 2011 19:23
    Moderator
  • hi,

    du hast folgende drei Möglichkeiten:

    USE AdventureWorksLT ;
    
    SET STATISTICS IO ON;
    
    SELECT A.*
    FROM  SalesLT.Address A
        LEFT OUTER JOIN SalesLT.SalesOrderHeader SOH ON SOH.ShipToAddressID = A.AddressID
    WHERE  SOH.SalesOrderID IS NULL ;
    
    SELECT A.*
    FROM  SalesLT.Address A
    WHERE  NOT A.AddressID IN ( SELECT SOH.ShipToAddressID
                   FROM  SalesLT.SalesOrderHeader SOH ) ;
        
    SELECT A.*
    FROM  SalesLT.Address A
    WHERE  NOT EXISTS ( SELECT 1
               FROM  SalesLT.SalesOrderHeader SOH
               WHERE SOH.ShipToAddressID = A.AddressID ) ;
    
    
    Wichtig ist, das du dir immer den aktuellen Ausführungsplan und die IO-Statisitk ansiehst. In obigem Fall ist also die erste Möglichkeit zu bevorzugen.


    Microsoft MVP Office Access
    https://mvp.support.microsoft.com/profile/Stefan.Hoffmann
    Montag, 11. April 2011 11:05