Как объединить разные таблицы, включив в запрос оператор исключений? - PullRequest
0 голосов
/ 27 марта 2020

Я просматривал разные сайты и не нашел ни одного примера, как объединить разные таблицы при поиске результата, включив в запрос оператор исключений. Узнать структуру такого запроса было бы очень полезно! Допустим, я хочу найти имена людей, которые не пили пиво. Anchor Steam Beer, как должна выглядеть операция запроса?

Моя собственная попытка выглядела так:

select namn from pb join b on pb.sysnr = b.sysnr except select beer from b where beer = 'Anchor Steam Beer';
b
sysnr       bryggeri    beer                land        pris
----------  ----------  ------------------  ----------  ----------
11410       Alesmith    Alesmith Decadence  USA         212
1675        Anchor      Anchor Steam Beer   USA         63.72
1407        Carlsberg   Backyard Brew       Danmark     30
1229        Carlsberg   Carlsberg           Danmark     36.06
1553        Cosmos      Chang Beer          Thailand    48.18
1551        De Molen    Citra Pale Ale      Holland     69.39
1598        Modelo      Corona Extra        Mexiko      43.9
1559        Coors       Coors Light         USA         45.15
1548        Brooklyn    Brooklyn Lager      USA         50.42
11226       Gigantic    Gigantic IPA        USA         130.62
89607       Lagunitas   Lagunitas IPA       USA         64.51
1625        Sierra Nev  Sierra Nevada Pale  USA         67.32
1649        Boston Bre  Samuel Adams Bosto  USA         57.75
1574        Pabst Blue  Pabst Blue Ribbon   USA         39.16
1522        Sinebrycho  Karhu               Finland     29
1519        Sinebrycho  Saxon               Finland     27.8
30023       Stallhagen  US Red Ale          Finland     90.61
1594        Scottish&N  Lapin Kulta         Finland     38.79
1403        Carlsberg   Tuborg              Danmark     36.06
1670        Dortmunder  DAB                 Tyskland    25
1416        InBev       Lowenbrau           Tyskland    31.8
1506        Friesische  Jever               Tyskland    42.12
1565        Bitburger   Bitburger           Tyskland    40.61
1260        Guinness    Guinness Draught    Irland      40.81
1344        Amstel      Amstel              Holland     42.12
1544        Litovel     Litovel Classic     Tjeckien    33.03
11489       Pilsner Ur  Gambrinus           Tjeckien    34.8
89301       Pivovar Be  Bernard             Tjeckien    41.6
1353        Budweiser   Budvar              Tjeckien    40.61
1611        Drinks Uni  Breznak             Tjeckien    36.06
1566        Pilsner Ur  Pilsner Urquell     Tjeckien    48.18
11581       BrewDog     Trashy Blonde       Storbritan  63.33
1515        BrewDog     Punk IPA            Storbritan  67.88
1642        Fuller Smi  Fullers London Pri  Storbritan  49.8
1585        San Miguel  San Miguel          Spanien     46.67
11451       Carlsberg   Pripps Bla          Sverige     33.03
11433       Carlsberg   Falcon Export       Sverige     36.06
1222        Kopparberg  Sofiero             Sverige     30
30658       Stigberget  Stigbergets Saison  Sverige     75.46
30611       Dugges      Dugges High Five    Sverige     75.46
1523        Epic        Armageddon IPA      Nya Zeelan  75.46
1540        Abbey of W  Westmalle Double    Belgien     89.09
1650        Orval       Orval               Belgien     81.52
89793       Duvel Moor  Maredsous Tripel    Belgien     101.82
1659        InBev       Leffe Blond         Belgien     63.33
1664        Brouwerij   Kwak                Belgien     74.24
1654        Duvel Moor  Duvel               Belgien     80.3
1657        Chimay      Chimay vit          Belgien     87.58
pb
name        sysnr       liter
----------  ----------  ----------
Agneta      1260        123
Alan        1559        1
Alan        1540        45
Alan        11410       7
Alan        1650        29
Alan        89793       15
Alan        1659        11
Alan        1670        9
Alan        1664        7
Alan        1654        23
Alan        1657        16
Alan        1675        74
Alan        1515        7
Alan        1565        34
Alan        1553        23
Alan        1260        42
Alan        89607       5
Alan        1594        14
Alan        11581       14
Alan        1574        15
Alan        1649        17
Alan        1523        27
Alan        1585        11
Alan        1548        5
Alan        1625        33
Alan        1403        21
Alan        1566        16
Alan        1642        26
Alan        11226       89
Alan        1670        10
Alan        1565        19
Alan        1416        25
Alan        1506        102
Dick        1642        44
Dick        1553        52
Dick        11410       12
Dina        1222        2
Dina        1574        4
Dina        1650        8
Fredrik     1559        43
Fredrik     30611       4
Fredrik     1403        87
Fredrik     11451       43
Henrik      1566        115
Henrik      1611        133
Henrik      1353        129
Henrik      1544        143
Henrik      11489       24
Henrik      89301       129
Kalle       1675        12
Kalle       11433       7
Kalle       1522        72
Kalle       1519        26
Kalle       30023       72
Kalle       1594        70
Kalle       1551        44
Janne       1260        33
Janne       1506        25
Janne       1559        56
Johan       1515        32
Johan       1559        323
Johan       1548        36
Johan       1670        78
Johan       11410       7
Jonas       1403        5
Kjell       1515        4
Kjell       1559        55
Kjell       11433       14
Kjell       1548        20
Lennart     11489       22
Lennart     1540        13
Lennart     1650        99
Lennart     89793       2
Lennart     1659        56
Lennart     1670        3
Lennart     1664        5
Lennart     1565        45
Lennart     1344        23
Lennart     11226       60
Lennart     11451       342
Lennart     1407        15
Lennart     1594        10
Lennart     11581       18
Lennart     1574        35
Lennart     1523        35
Lennart     1403        54
Lennart     1566        11
Lennart     1642        56
Lisen       1565        56
Lisen       1407        7
Lisen       1657        34
Lisen       1553        2
Lisen       1594        30
Lisen       1548        50
Lisen       30611       24
Lisen       30658       32
Lisen       1403        10
Magnus      1260        54
Magnus      11410       13
Maria       1407        95
Marie       11451       2
Janne       1559        59
Janne       1649        12
Janne       11410       5
Juha        1403        40
Juha        1594        32
Juha        30023       7
Juha        1574        20
Juha        1522        20
Juha        1523        4
Juha        30658       34
Juha        1403        30
Juha        1566        27
Rikard      1611        65
Rikard      1353        34
Rikard      1544        43
Rikard      11489       74
Rikard      1540        12
Rikard      1650        27
Rikard      89793       11
Rikard      1659        7
Rikard      1670        34
Rikard      1664        51
Rikard      1654        12
Rikard      1657        9
Urban       1642        14
Urban       1670        10
Urban       1565        19
Urban       1416        25
Urban       1506        102
Urban       11410       12

1 Ответ

1 голос
/ 27 марта 2020

Вы можете использовать агрегацию. Предполагая, что имена таблиц: beers и person_beers:

select pb.name
from person_beers pb
inner join beers b on b.sysnr = pb.sysnr
group by pb.name
having max(case when b.beer = 'Anchor Steam Beer' then 1 else 0 end) = 0

В более типичной ситуации у вас будет отдельная таблица для хранения людей, которая будет указана в таблице мостов person_beers , и вы будете использовать not exists:

select p.*
from persons
where not exists (
    select 1
    from person_beers pb
    inner join beers b on b.sysnr = pb.sysnr
    where pb.person_id = p.person_id and b.beer = 'Anchor Steam Beer'
)
...