Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 子查询oracle_Sql_Oracle_Greatest N Per Group - Fatal编程技术网

Sql 子查询oracle

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; 有人能帮我吗?我试图准备一些

我想为每个房子的最小图像大小选择房子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:

:


在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       |
+----+--------+-----+------------+