Announcement

Collapse
No announcement yet.

Menge von Untermengen vergleichen

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

  • Menge von Untermengen vergleichen

    Hallo,
    ich möchte herausfinden, ob eine Untermenge in einer anderen Untermenge enthalten ist.
    Die fachliche Anforderung ist: ich will das Material finden, das zu einer Stückliste (BOM) hinzugefügt werden darf.

    Beispiel:
    Stueckliste 1 darf von den Abteilungen 1 und 2 benutzt werden.
    Nur Material darf hinzugefügt werden, das von den Abteilungen 1 UND 2 benutzt werden darf.
    Im Beispiel unten wäre das Material 1 und 4.


    create table materiel_dept( materiel int not null, dept int not null )
    go
    create table bom_dept( bom int not null, dept int not null )
    go
    insert into materiel_dept( materiel, dept) values (1,1)
    insert into materiel_dept( materiel, dept) values (1,2)
    insert into materiel_dept( materiel, dept) values (1,3)
    insert into materiel_dept( materiel, dept) values (2,1)
    insert into materiel_dept( materiel, dept) values (3,2)
    insert into materiel_dept( materiel, dept) values (4,1)
    insert into materiel_dept( materiel, dept) values (4,2)
    insert into bom_dept(bom,dept) values(1,1)
    insert into bom_dept(bom,dept) values(1,2)

    Ich möchte alles Material lesen, das einer gegebenen Stückliste hinzugefügt werden darf (hier: Stückliste=bom=1).
    Zur Stückliste 1 gehören die Abteilungen (dept) 1 und 2.

    Also muss ich für jedes Material nachsehen, ob es Rechte für die Abteilungen 1 und 2 hat.
    Das wären das Material 1 und 4.

    Die üblichen Verdächtigen (correlated subqueries, all / in Operatoren) passen irgendwie nicht.
    Irgendwelche Vorschläge?

  • #2
    sollte mit in funktionieren

    Comment


    • #3
      sag mir wie

      Comment


      • #4
        Hallo Peter123,

        das mit dem IN passt schon und sollte nicht so schwer sein; für Deine Anforderung brauch es dann noch eine Kleinigkeit, nämlich das das Material für alle beteiligten Abteilung verfügbar sein muss => HAVING

        Das müsste so halbwegs hinhauen.
        Dem GO entnehme ich, Du nutzt dem MSSQL Server, richtig? Dann stimmt auch die Syntax:

        [highlight=SQL]

        create table #materiel_dept( materiel int not null, dept int not null )
        go
        create table #bom_dept( bom int not null, dept int not null )
        go
        insert into #materiel_dept( materiel, dept) values (1,1)
        insert into #materiel_dept( materiel, dept) values (1,2)
        insert into #materiel_dept( materiel, dept) values (1,3)
        insert into #materiel_dept( materiel, dept) values (2,1)
        insert into #materiel_dept( materiel, dept) values (3,2)
        insert into #materiel_dept( materiel, dept) values (4,1)
        insert into #materiel_dept( materiel, dept) values (4,2)

        insert into #bom_dept(bom,dept) values(1,1)
        insert into #bom_dept(bom,dept) values(1,2)
        GO

        DECLARE @StkLst int
        SET @StkLst = 1

        SELECT materiel
        FROM #materiel_dept
        WHERE dept IN (SELECT dept
        FROM #bom_dept
        WHERE bom = @StkLst)
        GROUP BY materiel
        HAVING COUNT(*) = (SELECT COUNT(dept)
        FROM #bom_dept
        WHERE bom = @StkLst)
        GO

        DROP TABLE #materiel_dept
        DROP TABLE #bom_dept[/highlight]
        Olaf Helper

        <Blog> <Xing>
        * cogito ergo sum * errare humanum est * quote erat demonstrandum *
        Wenn ich denke, ist das ein Fehler und das beweise ich täglich

        Comment


        • #5
          heißen dank

          Comment

          Working...
          X