我在下面链接的照片中有两张表,我使用此查询加入这些表:
declare @ID INT = 1
select *
from PhotoAlbum_Table,Photo_Table
where PhotoAlbum_Table.ID=@ID
and ( PhotoAlbum_Table.PhotoAlbumID=Photo_Table.PhotoAlbumID)
但我需要在加入这些表后删除一些记录(具有相同主键的记录)但不知道如何,我在照片上标记了它们。
我想要用户的所有相册,以及他们上传到该相册的最后一张photoUrl。
答案 0 :(得分:1)
您需要将选择组合在一起。
DECLARE @ID int = 1;
SELECT <Choose the specific items you want> FROM PhotoAlbum_Table AS a
INNER JOIN Photo_Table AS p ON a.PhotoAlbumID = p.PhotoAlbumID
WHERE a.ID = @ID;
GROUP BY <The specific items> --Add this line
修改强>
根据我将使用的新信息。
DECLARE @ID int = 1;
WITH cte (
PhotoAlbumID,
PhotoID,
PhotoAlbumDate,
PhotoAlbumName,
PrivacyID
) AS (
SELECT a.PhotoAlbumID,
MAX(p.PhotoID)
a.PhotoAlbumDate,
a.PhotoAlbumName,
a.PrivacyID
FROM PhotoAlbum_Table AS a
INNER JOIN Photo_Table AS p ON a.PhotoAlbumID = p.PhotoAlbumID
WHERE a.ID = @ID;
GROUP BY a.PhotoAlbumID,
a.PhotoAlbumDate,
a.PhotoAlbumName,
a.PrivacyID
)
SELECT cte.*, u.PhotoUrl FROM cte
INNER JOIN Photo_Table AS u ON cte.PhotoID = u.PhotoID;
答案 1 :(得分:0)
嗯,这种类型的查询通常不容易,至少是第一次。这是因为在定义诸如&#34;最新的URL&#34;之类的东西时,SQL语言没有帮助,它很容易获取&#34;最新的日期&#34;,或者#34;最大的ID&#34; (假设你有一些自动编号)。
但对于&#34;最新的网址&#34;你必须基本上把问题分成&#34;最新的URL修改日期&#34;然后是##;匹配最新日期&#34;。
的网址但是,如果您在相对较新的sql server(2008+)上工作,可以在行编号和分区功能的帮助下将其写下来。如果您选择现在正在执行的所有操作,并在URL Date上选择rownumber(),那么您将能够选择rownumber == 1的行。
简而言之:
partitioned by albumId
和ordered descending by photoDate
where rownumber = 1
在粗略的草图中,它看起来像:
select *
from
(
select
al.albumid,
...
ph.photourl,
rownumber() over (
partition by al.albumid
order by ph.photoDate
) as rn
from albums al
join photos ph on ph.album = al.albumid
)
where tmp.rn = 1
但这是一个草图,根据您的需要进行调整