SQL: выбор одной строки в соединении таблицы ссылок

Представьте, что у меня есть две таблицы, food и people , и я указываю, кому нравится, какая еда со ссылкой. Так:

 foods ----- sausages pie Mars bar people ------ john paul george ringo person | food (link table) -------+----- john | pie john | sausage paul | sausage 

Я хотел бы получить список продуктов, а также человека, который любит эту еду. Поэтому мне бы хотелось, чтобы таблица выглядела так:

 food | a randomly chosen liker ---------+------------------------ sausage | john (note: this could be "paul" instead) pie | john (note: must be john; he's the only liker) Mars bar | null (note: nobody likes it) 

Можно ли сделать это в одном запросе?

Очевидно, я могу сделать:

 select f.food, p.person from food f inner join link l on f.food = l.food inner join person p on l.person = p.person 

но это даст мне две строки sausage , потому что двум людям это нравится, и мне придется самостоятельно дедуплицировать ряды.

LEFT JOINs чтобы также получить пищу, которой никто не любит. GROUP BY чтобы получить каждую пищу только один раз, используйте MIN чтобы выбрать первого человека, который любит эту пищу.

 select f.food, min(p.person) from food f left join linktable l on f.id = l.food_id left join people p on p.id = l.person_id group by f.food 
 select f.food, min(l.person) from food f left join link l on f.foods = l.food group by f.food 

Я бы использовал раздел для этого, например:

 WITH ORDERED AS ( SELECT PERSON, FOOD, ROW_NUMBER() OVER (PARTITION BY lower(FOOD) ORDER BY lower(PERSON) DESC) AS RN FROM ( SELECT 'john' AS PERSON ,'pie' AS FOOD FROM DUAL UNION SELECT 'john1' AS PERSON ,'sausage' AS FOOD FROM DUAL UNION SELECT 'john2' AS PERSON ,'sausage' AS FOOD FROM DUAL UNION SELECT 'john3' AS PERSON ,'sausage' AS FOOD FROM DUAL UNION SELECT 'john4' AS PERSON ,'sausage' AS FOOD FROM DUAL UNION SELECT 'john5' AS PERSON ,'eggs' AS FOOD FROM DUAL UNION SELECT 'john6' AS PERSON ,'sausage' AS FOOD FROM DUAL UNION SELECT 'dada' AS PERSON ,'sausage' AS FOOD FROM DUAL UNION SELECT 'paul' AS PERSON ,'sausage' AS FOOD FROM DUAL -- Your select statement here that links the two tables ) PERSON_FOOD ) SELECT FOOD, PERSON FROM ORDERED WHERE RN = 1 

Это даст вам следующее:

 FOOD | PERSON ------------------- eggs | john pie | john sausage | paul 

Это в синтаксисе оракула

Другой вариант .. (Предположим, что это SQL Server)

 Select a.Food, b.Person from foods a outer apply ( Select top 1 Person from linkTable b where a.Food = b.Food ) b