想象一下,我有两个表,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
行,因为有两个人喜欢它,我将不得不自行重复删除行。
答案 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语法