Announcement

Collapse
No announcement yet.

T-SQL Abfrage

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

  • T-SQL Abfrage

    Hallo allerseits,

    ich habe ein Problem mit einer Abfrage. Ich dachte es sei kein Problem, aber irgendwie bin ich ganz verwirrt

    Ich habe folgende Tabelle:

    PID Property WERT
    ---------------------------------
    10 FA 7
    10 FG 9
    10 KR 153
    10 KR 154
    10 KR 155
    10 SP 45
    11 FA 1
    11 FA 2
    11 FA 7
    11 KR 154
    11 SP 45
    12 FA 5
    12 KR 153
    12 KR 154
    12 KR 150
    12 SP 55

    natürlich ist die Tabelle viel länger aber das ist ein ganz guten Beispiel.

    Ich möchte nun alle PIDs haben die:
    die Eigenschaft = "KR" mit dem Wert = "154" UND
    die Eigenschaft = "FA" mit dem Wert = "7" UND
    die Eigenschaft = "SP" mit dem Wert = "45" haben.

    Das Ergebnis ist PID 10 und 11.
    Die 12 hat zwar die "KR" mit 154 aber es fehlt ihm an der "SP" mit 45


    Ich weiss nicht wie ich diese Wertepaare bilden muss, so das ich die Verknüpfung zwischen Wert und Eigenschaft habe.

    Versteht irgendjemand was ich meine???

    Ich würde mich riesig über einen kleinen Tipp freuen.


    Beste Grüße

    Andy

  • #2
    Hallo,

    das folgende Beispiel demonstriert einen der möglichen Lösungswege:
    [highlight=SQL]
    USE tempdb
    GO

    CREATE TABLE dbo.TestTbl
    (
    pid INT NOT NULL,
    prop VARCHAR(9) NOT NULL,
    wert INT NOT NULL
    )
    GO
    INSERT INTO dbo.TestTbl (pid,prop,wert) VALUES (10,'KR', 154)
    INSERT INTO dbo.TestTbl (pid,prop,wert) VALUES (10,'FA', 7)
    INSERT INTO dbo.TestTbl (pid,prop,wert) VALUES (10,'SP', 45)
    INSERT INTO dbo.TestTbl (pid,prop,wert) VALUES (12,'KR', 154)
    GO

    SELECT
    DISTINCT pid
    FROM
    dbo.TestTbl
    WHERE
    (pid IN (SELECT pid FROM dbo.TestTbl WHERE prop = 'KR' AND wert = 154)) AND
    (pid IN (SELECT pid FROM dbo.TestTbl WHERE prop = 'FA' AND wert = 7)) AND
    (pid IN (SELECT pid FROM dbo.TestTbl WHERE prop = 'SP' AND wert = 45))
    GO
    [/highlight]

    Comment


    • #3
      Super

      Hallo Andreas,
      vielen Dank!
      Das ist genau das was ich gesucht habe.

      Weil Du schreibst "einer der Wege", es würde mich interessieren, an was Du da denkst.
      Ist aber auch nicht so wichtig, ich möchte Dir nicht unnötig Arbeit machen.

      Besten Dank und viele Grüße
      Andy

      Comment


      • #4
        Hallo,
        So kannst Du es auch machen:

        SELECT DISTINCT
        Tabelle.pid FROM Tabelle
        WHERE exists
        (SELECT * FROM Tabelle t1 WHERE Tabelle.pid=t1.pid
        and t1.prop = 'KR' AND t1.wert = 154)
        AND exists
        (SELECT * FROM Tabelle t2 WHERE Tabelle.pid=t2.pid
        and t2.prop = 'FA' AND t2.wert = 7)
        AND exists
        (SELECT * FROM Tabelle t3 WHERE Tabelle.pid=t3.pid
        and t3.prop = 'SP' AND t3.wert = 45)

        Gruß
        docendo discimus

        Comment


        • #5
          ...Und das müßte auch gehen:
          [highlight=sql]
          SELECT Tabelle.pid FROM Tabelle
          WHERE 3 = (
          select count(distinct t1.prop)
          from Tabelle t1
          where t1.pid = Tabelle.pid
          AND (( t1.prop = 'KR' AND t1.wert = 154)
          OR (t1.prop = 'FA' AND t1.wert = 7)
          OR (t1.prop = 'SP' AND t1.wert = 45))
          )
          [/highlight]

          oder gleich so:
          [highlight=sql]
          SELECT t1.pid
          from Tabelle t1
          where (t1.prop = 'KR' AND t1.wert = 154)
          OR (t1.prop = 'FA' AND t1.wert = 7)
          OR (t1.prop = 'SP' AND t1.wert = 45)
          group by t1.pid
          having count(distinct t1.prop) = 3
          [/highlight]

          Gruß Falk
          Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

          Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

          Comment


          • #6
            Hallo Falk,

            damit Deine Lösungen funktionieren, wäre allerdings ein Eindeutigkeitsindex über die Felder pid, prop und Wert Voraussetzung. Und ob die gegeben ist, weiß bisher nur Andy.

            Gruß

            frauwue
            docendo discimus

            Comment


            • #7
              Originally posted by frauwue View Post
              Hallo Falk,

              damit Deine Lösungen funktionieren, wäre allerdings ein Eindeutigkeitsindex über die Felder pid, prop und Wert Voraussetzung. ...
              Wieso?

              Ok, bei meinem ersten Vorschlag fehlt noch ein DISTINCT, aber ansonsten wüßte ich nicht warum ein Eindeutigkeitsindex benötigt wird.

              Gruß Falk
              Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

              Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

              Comment


              • #8
                Hallo Falk,

                ich muss mich entschuldigen, ich hatte das distinct t1.prop überlesen . Ich hatte es als count(*) interpretiert.


                Gruß

                frauwue
                docendo discimus

                Comment


                • #9
                  Hallo,

                  Weil Du schreibst "einer der Wege", es würde mich interessieren, an was Du da denkst..
                  Wenn die neuen Möglichkeiten des MS SQL Server 2005 ausgeschöpft werden sollen, führt auch die Kombination einer Common Table Expressions (CTE) mit der INTERSECT-Anweisung zum Ziel:

                  [highlight=SQL]
                  WITH cte AS
                  (
                  SELECT pid FROM dbo.TestTbl WHERE prop = 'KR' AND wert = 154
                  INTERSECT
                  SELECT pid FROM dbo.TestTbl WHERE prop = 'FA' AND wert = 7
                  INTERSECT
                  SELECT pid FROM dbo.TestTbl WHERE prop = 'SP' AND wert = 45
                  )
                  SELECT * FROM cte
                  [/highlight]

                  Comment

                  Working...
                  X