SQL:在链接表中获取一行加入

时间:2016-01-13 10:21:22

标签: sql

想象一下,我有两个表,foodpeople,我指出谁喜欢带链接表的食物。所以:

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行,因为有两个人喜欢它,我将不得不自行重复删除行。

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

select f.food, min(l.person)
from food f
    left join link l on f.foods = l.food
group by f.food

答案 2 :(得分:0)

另一种变体..(假设它是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

答案 3 :(得分:0)

我会使用分区来执行此操作,例如:

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

这是oracle语法