Sql 子查询oracle
我想为每个房子的最小图像大小选择房子id、房子名称、图像名称和大小 创建表屋id int,名称varchar50; 创建表映像id int,name varchar50,house_id int,siz int; 插入房屋id,名称值为1,'house1'; 插入房屋id,名称值2,'house2'; 插入图像值31,'img1',1,10; 插入图像值32,'img2',2,20; 插入图像值33,'img3',2,15; 插入图像值34,'img4',2,19; 有人能帮我吗?我试图准备一些查询,但在最后一列中,我总是得到空值 选择h.id、h.name、m.mid、i.name 从房屋h左侧连接选择minsiz作为中间,从图像中选择房屋id 按h.id上的房屋id m分组=m.house\U id i.id=m.house\u id上的左连接图像i 结果: 两个选项-一个使用行数分析函数,另一个使用聚合函数: Oracle 11g R2架构设置: 问题1: : 问题2: :Sql 子查询oracle,sql,oracle,greatest-n-per-group,Sql,Oracle,Greatest N Per Group,我想为每个房子的最小图像大小选择房子id、房子名称、图像名称和大小 创建表屋id int,名称varchar50; 创建表映像id int,name varchar50,house_id int,siz int; 插入房屋id,名称值为1,'house1'; 插入房屋id,名称值2,'house2'; 插入图像值31,'img1',1,10; 插入图像值32,'img2',2,20; 插入图像值33,'img3',2,15; 插入图像值34,'img4',2,19; 有人能帮我吗?我试图准备一些
在Oracle 12c中,您可以使用外部应用,在我看来,它比行数更简单
不要混合where和i.rn=1以及join条件,从长远来看,这可能会让人困惑。我重写了查询。@mucio这是错误的-这使查询成为内部联接而不是左外部联接。你是对的,但我仍然不会将rn=1放在联接条件中,而是放在附加的子查询中
| ID | NAME | MID | NAME |
|----|--------|-----|--------|
| 1 | house1 | 10 | (null) |
| 2 | house2 | 15 | (null) |
create table house( id int, name varchar(50));
create table image( id int, name varchar(50), house_id int, siz int);
insert into house (id, name) values (1,'house1');
insert into house (id, name) values (2,'house2');
insert into image values (31,'img1',1, 10);
insert into image values (32,'img2',2, 20);
insert into image values (33,'img3',2, 15);
insert into image values (34,'img4',2, 19);
SELECT h.id, h.name, i.siz, i.name AS image_name
FROM house h
LEFT OUTER JOIN (
SELECT i.*,
ROW_NUMBER() OVER (
PARTITION BY house_id
ORDER BY siz
) AS rn
FROM image i
) i
ON ( h.id = i.house_id AND i.rn = 1 )
| ID | NAME | SIZ | IMAGE_NAME |
|----|--------|-----|------------|
| 1 | house1 | 10 | img1 |
| 2 | house2 | 15 | img3 |
SELECT h.id,
MIN( h.name ) AS name,
MIN( i.siz ) AS siz,
MIN( i.name ) KEEP ( DENSE_RANK FIRST ORDER BY siz ) AS image_name
FROM house h
LEFT OUTER JOIN image i
ON ( h.id = i.house_id )
GROUP BY h.id
| ID | NAME | SIZ | IMAGE_NAME |
|----|--------|-----|------------|
| 1 | house1 | 10 | img1 |
| 2 | house2 | 15 | img3 |
SELECT h.id, h.name, i.siz, i.name as image_name
FROM house h
OUTER APPLY ( SELECT i.*
FROM image i
WHERE i.house_id = h.id
ORDER BY i.siz ASC
FETCH FIRST 1 ROW ONLY ) i;
+----+--------+-----+------------+
| ID | NAME | SIZ | IMAGE_NAME |
+----+--------+-----+------------+
| 1 | house1 | 10 | img1 |
| 2 | house2 | 15 | img3 |
+----+--------+-----+------------+