2017-02-24 66 views
0

我在SQL Server中创建这个简单的数据库:内侧内SELECT TOP JOIN

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) 

我想是选择所有产品和只有一个画面的每一个产品。任何帮助是极大的赞赏。

+0

你尝试'内加入(选择顶部1等从大声笑)img on img.whatever = outer.whatever'? – Will

+1

你想要哪张照片? – Hogan

+0

未来版本的SQL Server中将删除'ntext','text'和'image'数据类型。避免在新的开发工作中使用这些数据类型,并计划修改当前正在使用它们的应用程序。改为使用'nvarchar(max)','varchar(max)'和'varbinary(max)'。 (详见这里)(http://msdn.microsoft.com/en-us/library/ms187993.aspx) –

回答

0
SELECT 
*, 
(
    SELECT TOP 1 p2.p_path 
    FROM dbo.picture p2 
    WHERE p.id = p2.product 
) AS picture 
FROM dbo.product p 

或者与加盟:

SELECT 
* 
FROM dbo.product p 
INNER JOIN 
(
    SELECT p2.product, MIN(p2.p_path) AS p_path 
    FROM dbo.picture p2 
    GROUP BY p2.product 
) AS pt 
ON p.id = pt.product 

但是你需要改变p_path到varchar

+0

这将工作,但应该提到的是,如果OP想要一致地返回哪个图片,子查询需要通过订单。 –

+0

原来的问题说他想加入。 – Hogan

0

我会用一个窗口函数是这样的:

SELECT * 
FROM product 
JOIN (
    SELECT id, product, p_path, 
     row_number() OVER (PARTITION BY product ORDER BY id ASC) as RN 
    FROM picture 
) pic ON product.id = pic.product AND pic.RN = 1 

,你可以看到这里我选择最低的图片(ORDER BY id ASC) - 你可以c根据您的要求将此订单更改。

+0

有趣的你认为这将工作,因为你没有提供加入表 – Paparazzi

+0

@Paparazzi - 哈哈良好的捕获 - 完全放弃了'FROM'子句。 – Hogan

2

我的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; 

可以包括order by得到一个特定的图片(比如,一个具有最低或最高ID)。或者,order by newid()得到一个随机的。

+0

嗨,戈登,只是想了解你的qry,因为我从来没有用过APPLY作为我的开发者;在这种情况下,你不像使用经典的左连接一样获得相同的结果/ exec计划吗? –

+1

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

+0

无需返回p * – Paparazzi

0

您是否尝试过使用相关的子查询?

SELECT *, (SELECT TOP 1 p_path FROM picture WHERE product = p.id ORDER BY id) 
FROM picture p 

希望这有助于

-1

只是GROUP BY和采取的最低或最高
左连接的情况下,没有图像

select pr.ID, pr.label, pr.text, pr.price 
    , min(pic.p_path) 
from product pr 
left join picture pic 
on pic.product = pr.ID 
group by pr.ID, pr.label, pr.text, pr.price 
+0

有趣的是,OP特别要求内连接(暗示他只想要带图片的结果),为什么你会建议左连接? – Hogan

+0

@Hogan这在我的答案中已涵盖。 “如果没有图片,请左参加” – Paparazzi

+0

@Hogan OP也表示要所有产品。基于首先提出这个问题,OP不清楚内连接的含义。 – Paparazzi