Hirdetés

Új hozzászólás Aktív témák

  • Atcom
    csendes tag

    Sziasztok,

    Lenne egy SQL-es kérdésem, remélem tudtok segíteni.

    Két táblám van mindkettőben csak 2 mező, h minél egyszerűbb legyen.
    Első tábla:
    hozzavalok, az alabbi mezoket tartalmazza
    -alapanyag
    -keszetel

    Értelemszerűen azt mutatja meg, h adott kesz_etel elkészítéséhez milyen alapanyagokra van szükségünk. (természetesen mindkettő id, azaz ineteger tipusú). mindkettő többször is szerepelhet a táblában, hiszen egy kész étel több alapanyagot is tartalmazhat, és egy alapanyag több készételbe is kerülhet. Viszont egy alapanyag-keszetel pár csak egyszer szerepel, nincs két ugyanolyan rekord.

    A második tábla:
    kinek_mi_van_otthon, az alabbi mezokkel
    -nev
    -alapanyag

    Melyben azt láthatjuk, h ki milyen alapanyagokkal rendelkezik. itt is igaz, ami az első táblánál, tehát: mindkét mező id, egy embernek több alapanyaga is lehet, ugyanaz az alapanyag egyszerre több embernek is birtokában lehet, de duplázódás nincs.

    Egy olyan lekérdezést szeretnék összehozni, mely megadja, h mely emberek mely készételeket tudják elkészíteni. Itt ugye megint egyszerű a szabály, azokat a készételeket tudja elkészíteni adott ember, amelynek összes alapanyagával rendelkezik. Látszólag tök egyszerű a dolog, hiszen csak 2 tábla, 2 mező, de nekem valahogy mégsem jön össze.

    Előre is köszi a segítséget!

    Üdv, Szecska_

    Íme egy T-SQL megoldás. Sajnos nem volt elég időm rendesen kidolgozni, de remélem, hogy tudod majd használni.

    create table [hozzavalok]
    (
    [keszetel_id] [int] not null,
    [alapanyag_id] [int] not null,

    constraint [PK_hozzavalok] primary key clustered
    (
    [keszetel_id], [alapanyag_id]
    )
    )

    create table [kinek_mi_van_otthon]
    (
    [szemely_id] [int] not null,
    [alapanyag_id] [int] not null,

    constraint [PK_kinek_mi_van_otthon] primary key clustered
    (
    [szemely_id], [alapanyag_id]
    )
    )

    insert into hozzavalok
    values (1,1),
    (1,2),
    (1,3),
    (2,3),
    (2,4),
    (3,1),
    (3,5)

    insert into kinek_mi_van_otthon
    values (101,1),
    (101,2),
    (101,4),
    (102,1),
    (102,2),
    (102,3),
    (102,4),
    (102,5),
    (103,3),
    (103,4)

    select distinct
    keszetel_id, szemely_id
    from
    -- Minden készételhez egy személy hozzárendelése
    hozzavalok, (select distinct szemely_id from kinek_mi_van_otthon) sz
    where -- Csak azok a személyek kellenek, akiknél minden megvan
    not exists (
    -- Azon személyek halmaza, akiknek valamelyik készétel alapanyagából hiánya van
    select
    *
    from
    (select
    keszetel_id, alapanyag_id, szemely_id
    from
    -- Minden készétel alapanyaghoz egy személy hozzárendelése
    hozzavalok, (select distinct szemely_id from kinek_mi_van_otthon) sz) hv
    left outer join kinek_mi_van_otthon on kinek_mi_van_otthon.alapanyag_id = hv.alapanyag_id
    and kinek_mi_van_otthon.szemely_id = hv.szemely_id
    where
    kinek_mi_van_otthon. szemely_id is null -- Azon személyek kellenek, akiknél valamiből hiány van
    -- az adott készételnél
    and hv.keszetel_id = hozzavalok.keszetel_id
    and hv.szemely_id = sz.szemely_id
    )
    order by
    hozzavalok.keszetel_id, sz.szemely_id


    drop table hozzavalok
    drop table kinek_mi_van_otthon

Új hozzászólás Aktív témák