在 INNER JOIN 中选择 TOP

Out*_*man 3 sql t-sql sql-server sql-server-2008 sql-server-2008-r2

我在 SQL Server 中创建了这个简单的数据库:

create database product_test
go

use product_test
go

create table product 
(
    id int identity primary key,
    label varchar(255),
    description text,
    price money, 
);

create table picture 
(
    id int identity primary key, 
    p_path text, 
    product int foreign key references product(id) 
); 

insert into product 
values ('flip phone 100', 'back 2 the future stuff.', 950),
       ('flip phone 200', 's;g material', 1400)

insert into picture 
values ('1.jpg', 1), ('2.jpg', 1), ('3.jpg', 2)
Run Code Online (Sandbox Code Playgroud)

我想要的是选择所有产品,并且每个产品仅选择一张图片。任何帮助是极大的赞赏。

Gor*_*off 7

outer apply我是为此目的的粉丝:

select p.*, pi.id, pi.path
from product p outer apply
     (select top 1 pi.*
      from picture pi
      where pi.product = p.id
     ) pi;
Run Code Online (Sandbox Code Playgroud)

您可以包含 来order by获取一张特定图片(例如 ID 最低或最高的图片)。或者,order by newid()随机获得一个。

  • @PaulDaubian。。。应该是类似的。但是,“APPLY”(或更一般地说横向联接)可以具有更好的性能,因为它不需要生成附加了附加行号的所有行。如果您正在学习 APPLY ,您可以将其视为 FROM 子句中的相关子查询,其优点是可以返回多列和多行。 (3认同)