Announcement

Collapse
No announcement yet.

abfrage von einem datensatz innerhalb einer tabelle

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

  • abfrage von einem datensatz innerhalb einer tabelle

    hallo,
    vielleicht kann mir ja hier jemand helfen, ich habe folgendes problem:

    ich möchte eine abfrage erstellen in der mir die personen angezeigt werden, bei denen tenor, währung und default mit den werten von person '12345' übereinstimmen. nachfolgende abfrage habe ich bereits erstellt, bei der aber das problem auftritt, dass das system mir alle personen anzeigt bei denen es zu mindestens einer übereinstimmung kommt und nicht wie von mir gewünscht, nach einer kompletten übereinstimmung gesucht wird d.h. ich möchte, dass mir nur die personen angezeigt werden bei denen alle werte übereinstimmen. (zu jeder person gibt es mehrere tenor- und währungsunterscheidungen, d.h. zu personen '12345' mehrere spalten und zeilen nach denen komplett in der datenbank gesucht werden soll). Wie muss ich meine abfrage ergänzen, dass nur nach dem kompletten datensatz gesucht wird?

    select distinct b.personen
    from Tabelle1 a, Tabelle1 b
    where a.tenor = b.tenor
    and a.währung = b.währung
    and a.default = b.default
    and a.personen = '12345'
    order by b.personen asc

    vielen dank schonmal

  • #2
    Was meinst du mit kompletten Datensatz?

    Comment


    • #3
      Irgendwie durchblicke ich das Problem nicht ganz. Was ist denn der primary key? Wenn es die Person ist, sollte das Select eigentlich stimmen und du könntest auf das distinct verzichten und wenn die Person nicht zumindest ein unique key ist, dann hast du da sowieso ein größeres Problem wegen der where-Klausel ...

      Mache mal ein Beispiel mit ein paar Datensätzen, damit man sieht, wie das aussieht, wenn ein falsches Ergebnis kommt.



      bye,
      Helmut

      Comment


      • #4
        also der primary key soll tenor-tenor, währung-währung und default-default sein. ich mach mal ein beispiel.

        person tenor währung default
        12345 1 eur 1,023
        12345 2 eur 1,045
        12345 3 eur 1,78
        54789 1 usd 1,023
        54789 2 usd 1,045
        54789 3 usd 1,78
        654123 1 eur 1,023
        654123 2 eur 5
        654123 3 eur 7
        789456 1 eur 1,023
        789456 2 eur 1,045
        789456 3 eur 1,78

        die unterstrichenen werte sollen als datensatz angesehen werden (also als primärschlüssel). nach diesem soll also komplett gesucht werden. beispielsweise würde die person '789456' genau dem datensatz entsprechen. das problem welches ich bei meiner abfrage habe ist, dass mir auch die person '654123' angezeigt wird, weil bei ihr die erste zeile übereinstimmt. ich möchte, dass mir aber nur die person '789456' angezeigt wird, weil sie komplett dem datensatz entspricht. den distinct schlüssel habe ich gewählt, dass mir die zutreffenden personen nur einmalig angezeigt werden. in meiner zu bearbeitenden tabelle habe ich nämlich zu jeder person über hundert zeilen. ich hoffe es ist jetzt verständlicher für euch.

        ciao,
        peter

        Comment


        • #5
          Falls deine Datenbank EXCEPT/MINUS kennt (EXCEPT zB in SQL-Server ab 2005, in Oracle heisst das MINUS), könnte das passen:
          Code:
          -- Beispiel für SQL-Server 2005:
          
          declare @t table (
            person   int,
            tenor    int,
            währung  varchar(20),
            [default] real
          )
          
          insert into @t values(12345, 1, 'eur', 1.023)
          insert into @t values(12345, 2, 'eur', 1.045)
          insert into @t values(12345, 3, 'eur', 1.78)
          insert into @t values(54789, 1, 'usd', 1.023)
          insert into @t values(54789, 2, 'usd', 1.045)
          insert into @t values(54789, 3, 'usd', 1.78)
          insert into @t values(654123, 1, 'eur', 1.023)
          insert into @t values(654123, 2, 'eur', 5)
          insert into @t values(654123, 3, 'eur', 7)
          insert into @t values(789456, 1, 'eur', 1.023)
          insert into @t values(789456, 2, 'eur', 1.045)
          insert into @t values(789456, 3, 'eur', 1.78)
          
          select distinct b.person
          from @t b
          where (select count(*) from (
          select tenor, währung, [default] from @t x where x.person = '12345'
          except
          select tenor, währung, [default] from @t y where y.person = b.person) as X) = 0
          Ansonsten müsste man diese EXCEPT-Funktionalität über ein JOIN nachbilden ...

          bye,
          Helmut

          Comment


          • #6
            ich habe das Problem jetzt über einen cursor gelöst.

            declare @person numeric
            declare @person_vgl numeric
            declare @count_datasets int
            declare @count_datasets_vgl int

            select @person = 12345

            declare persnr_cursor cursor
            for
            select distinct b.person
            from Tabelle a, Tabelle b
            where a.tenor = b.tenor
            and a.währung = b.währung
            and a.default = b.default
            and a.person = @person
            order by b.person asc

            select @count_datasets =
            (select count(*)
            from Tabelle
            where person = @person)

            print '@count_datasets: ' + cast(@count_datasets as varchar)

            open persnr_cursor

            fetch next from persnr_cursor
            into @person_vgl

            WHILE @@FETCH_STATUS = 0
            BEGIN
            print '------------------------------------------------------------------'
            print '@person_vgl: ' + cast(@person_vgl as varchar)

            select @count_datasets_vgl =
            (select count(*)
            from Tabelle a, Tabelle b
            where a.tenor = b.tenor
            and a.währung = b.währung
            and a.default = b.default
            and a.person = @person
            and b.person = @person_vgl)

            print '@count_datasets_vgl: ' + cast(@count_datasets_vgl as varchar)

            if (@count_datasets = @count_datasets_vgl)
            print '***** Übereinstimmung für Person ' + cast(@person_vgl as varchar) + ' *****'
            else
            print 'Keine Übereinstimmung für Person ' + cast(@person_vgl as varchar)

            fetch next from persnr_cursor
            into @person_vgl
            END

            close persnr_cursor
            deallocate persnr_cursor

            go

            Comment

            Working...
            X