[MSSQL] Frage zu CASE iSNULL

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • [MSSQL] Frage zu CASE iSNULL

    Hallo,

    ich habe eine Abfrage, in der ich mir in einer extra Spalte anzeige, ob Tabelle 1 einen Fremdschlüssel in Tabelle 2 hat. Das wird über case isnull gelöst.

    Ich will mir aber nur von bestimmten Werten anschauen, ob ein Fremdschlüssel existiert. Wie müsste ich denn meine Abfrage abändern. Anbei mal die aktuelle:

    CASE ISNULL(Tab2.IDTab1, '') WHEN '' THEN 0 ELSE 1 END AS fs_exists

    Tabelle 1
    IDTab1|Name
    100000|name1

    Tabelle 2
    IDTab2|ID_X|IDTab1
    500000|1111|100000
    600000|2222|100000

    Mein Versuch hier. bringt einfach zu viele Datensätze zurück:

    select [...],
    CASE WHEN Tab2.ID_X = 1111 THEN CASE ISNULL(Tab2.IDTab1, '') WHEN '' THEN 0 ELSE 1 END ELSE 0 END AS fs_exists
    FROM [...]
    Last edited by jaqu; 21-09-2006, 12:32.

  • #2
    versuch mal
    PHP Code:
    select t1.IDTab1t1.[name], case  when t2.IDTab1 IS NULL then 0 else 1 end fs_exists
    from tabelle1 t1 left join tabelle2 t2 on t1
    .IDTab1 t2.IDTab1 

    Comment


    • #3
      Hi,

      ich musste noch was im Beitrag ändern. Ich habe leider vergessen, die TabellenNAmen auf mein gewähltest Beispiel abzuändern. Sorry!!!

      Deine Abfrage funktioniert soweit. Die erste Abfrage in meinem Posting ist das gleiche nur mit anderen Worten.

      Wie kann ich aber jetzt noch sagen, dass nur für bestimmte ID_X geprüft wird, ob eine FS-Beziehung besteht? Das ist genau der knackpunkt. Ich dachte, ob ich dass vielleicht in einer UnterSelectAbfrage bringe, aber da kommen immer Fehler.

      Comment


      • #4
        Original geschrieben von jaqu


        Wie kann ich aber jetzt noch sagen, dass nur für bestimmte ID_X geprüft wird, ob eine FS-Beziehung besteht? Das ist genau der knackpunkt. Ich dachte, ob ich dass vielleicht in einer UnterSelectAbfrage bringe, aber da kommen immer Fehler.
        where t2.ID_X = 1111

        Comment


        • #5
          >>where t2.ID_X = 1111

          hatte ich auch gedacht, aber leider fehlanzeige! Das zeigt mir dann nur die an, wo ID_X=1111 und ich kann mir die CASE sparen. Ich will ja wissen, ob FS exisitieren und falls ja, kommt eine 1, falls nein, eine 0. Hier nochmal das Beispiel von oben modifiziert. Ich will alle Daten aus Tab1, und in eine extra Spalte, ob für IDTab1 im Tab2 eine FSBeziehung gibt, aber nur für die ID_X1111.

          Tabelle 1
          IDTab1|Name
          100000|name1
          200000|name2
          300000|name3


          Tabelle 2
          IDTab2|ID_X|IDTab1
          500000|1111|100000
          600000|2222|100000
          700000|1111|300000

          Als Ausgabe stelle ich mir sowas vor

          IDTab1|Name |fs_exists
          100000|name1|1
          200000|name2|0
          300000|name3|1

          Das mit Where, würde mir glattweg die IDTab1=200000 nicht mit anzeigen.

          Comment


          • #6
            Na, dann sag's doch genauer
            PHP Code:
            select t1.IDTab1t1.[name], case  when t2.IDTab1 IS NULL then 0 else 1 end fs_exists
            from tabelle1 t1 left join tabelle2 t2 on t1
            .IDTab1 t2.IDTab1 and t2.ID_X=1111 

            Comment


            • #7
              Hi,

              danke dir! es funktioniert jetzt! Ich habe das zwar auch schon mehrfach benutzt, aber darauf wäre ich wahrscheinlich so schnell nicht gekommen. Ich dächte, man müsste noch ein CASE oder sowas einbauen. Vielen Dank dir!

              Comment


              • #8
                Hi,

                ich bins nochmal.... Das hat zwar alles soweit funktioniert, aber wenns ans Eingemacht geht, schweigen mich die Lämmer an.

                Wenn ich die Abfrage nun mir anzeigen lassen will auf einer Website, dann sind da leider keine Daten drin????!!!! Bzw. nur Nullen (sprich "0"). Ich programmiere zwar in .net, aber dass kann doch nicht der Grund sein. *verzweifle*
                In der Server Umgebung mit dem QueryBuilder funzt es tadelos. Ist das normal????

                Comment


                • #9
                  hm ... vielleicht etwas code, denn so kann man nicht viel sagen

                  *verschiebe*

                  Comment


                  • #10
                    naja, ich habe die Abfrage von dir genauso übernommen und die funzt - im Query Builder. alle Daten kommen ja an, nur halt nicht die eine Spalte. Ich probiere mal, wie es ist, wenn ich das vorher in eine Tabelle einlese und dann wieder auslese

                    Aber hier trotzdem mal:

                    SqlDataAdapter myDataAdapter_RefPOR = new SqlDataAdapter("SELECT DISTINCT POR_FC.FC_ID, POR_FC.FCName, POR_FC.User_ID,
                    POR_FC.DateOfCreation, POR_FC.RefPOR_ID, POR_FC.UpdateByUser, POR_FC.privateAccess, POR_FC.inUse,
                    POR_FC.DateOfUpdate, Comparison.US_ID as US_ID, Comparison.PreUS_ID, Comparison.POR_ID,
                    Comparison.Process_ID, Comparison.FCRN, Comparison.FCProcessName, Comparison.ProcessFlow, Comparison.Module, Comparison.UnitProcess, Comparison.UPMS, Comparison.NonPOR,

                    CASE WHEN POR.US_ID IS NULL THEN 0 ELSE 1 END AS SingleSiteRefProcesss

                    FROM
                    POR_FC INNER JOIN POR_FC_POR_Comparison AS Comparison ON POR_FC.FC_ID = Comparison.FC_ID LEFT OUTER JOIN POR_FC_Site_POR AS POR ON Comparison.US_ID = POR.US_ID AND POR.POR_ID = " + por_id + "WHERE (Comparison.POR_ID = " + ref_por_id + ") AND (POR_FC.FC_ID = " + fc_id + ") ORDER BY Comparison.ProcessFlow" ,myConn);

                    DataSet_POR myDataSet = new DataSet_POR();
                    myConn.Open();
                    myDataAdapter_RefPOR.Fill(myDataSet,"POR_FC_RefPOR"); //mein DataSet mit der Tabelle

                    Comment


                    • #11
                      hast du auch schon überprüft, ob

                      - por_id
                      - ref_por_id
                      - fc_id

                      die richtigen Werte enthalten? Schonmal die Abfrage ausgebenlassen, oder im Debugger mal angeschaut?

                      Comment


                      • #12
                        okay, hat funktioniert. es lag doch tatsächlich an den werten. meine güte, daran denkt man auch nur im geringsten ...... vielenDank!

                        Comment

                        Working...
                        X