2017-02-24 44 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