删除复杂sql查询中的重复数据

删除复杂sql查询中的重复数据,sql,sql-server,Sql,Sql Server,我有以下复杂的问题 SELECT TOP 20 [image].Image_id, Source_Link FROM Item INNER JOIN [Image] ON Item.Image_id = [Image].Image_id INNER JOIN Age_Item ON Item.Item_id = Age_Item.Item_id WHERE Gender = 'male' AND Age_Item.Age_id = 4

我有以下复杂的问题

SELECT TOP 20
    [image].Image_id, Source_Link
FROM 
    Item
INNER JOIN 
    [Image] ON Item.Image_id = [Image].Image_id
INNER JOIN 
    Age_Item ON Item.Item_id = Age_Item.Item_id
WHERE 
    Gender = 'male'
    AND Age_Item.Age_id = 4
    AND [Image].Image_id NOT IN
        (SELECT [Image].Image_id
         FROM [Image]
         INNER JOIN Item on [Image].Image_id = Item.Image_id
         INNER JOIN Session_Item on Item.Item_id = Session_Item.Item_id
         WHERE Session_Item.Session_id = 3)
ORDER BY 
    NEWID() -- random rows
然而,我意识到有时它会显示一些重复的结果,我想删除重复的行

我尝试了
选择DISTINCT
,但它显示了以下错误:

如果指定了select DISTINCT,则ORDER BY项目必须出现在选择列表中

在这种情况下,我不能使用
分组依据([Image].Image\u id)
,因为聚合函数中不包含列
[Image].Source\u链接

我应该如何解决此问题

//编辑: 我已经这样做了,谢谢你们的回答

SELECT TOP 20 * FROM
(
SELECT DISTINCT [image].Image_id, Source_Link
FROM Item
INNER JOIN [Image] ON Item.Image_id = [Image].Image_id
INNER JOIN Age_Item ON Item.Item_id = Age_Item.Item_id
WHERE Gender='male'
AND Age_Item.Age_id = 4
AND [Image].Image_id NOT IN
(
    SELECT [Image].Image_id
    FROM [Image]
    INNER JOIN Item on [Image].Image_id = Item.Image_id
    INNER JOIN Session_Item on Item.Item_id = Session_Item.Item_id
    WHERE Session_Item.Session_id = 3
)
)query ORDER BY NEWID();

…它对我来说编译得很好。

既然你想要一个随机的20个不同的顺序,你需要得到一个不同的集合,然后根据新的ID应用你的
前20个
顺序

你可以用CTE来做

with cte as (

SELECT DISTINCT [image].Image_id, Source_Link
FROM Item
INNER JOIN [Image] ON Item.Image_id = [Image].Image_id
INNER JOIN Age_Item ON Item.Item_id = Age_Item.Item_id
WHERE Gender='male'
AND Age_Item.Age_id = 4
AND [Image].Image_id NOT IN
(
    SELECT [Image].Image_id
    FROM [Image]
    INNER JOIN Item on [Image].Image_id = Item.Image_id
    INNER JOIN Session_Item on Item.Item_id = Session_Item.Item_id
    WHERE Session_Item.Session_id = 3
)
)
Select TOP 20 DISTINCT * FROM CTE ORDER BY NEWID() 

你有重复行的例子吗?是的,例如,这些是我最后一次测试的结果。例如,这些是我最后一次测试的结果。例如,这些是我最后一次测试的结果:48 ~/项目/项目/项目/48/项目/项目/48/项目/项目/48/项目/项目/48/项目/项目/项目/项目/项目/项目/项目/项目/项目/48/项目/项目/项目/项目/项目/项目/项目/项目/48/项目/项目/48/项目/项目/项目/项目/项目/项目/项目/194878787878787877 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7。。。请注意,id 84的行是重复的,但它在“')附近显示了错误语法。最后一个问题是我的不好,最后我忘了添加单词查询。是的,但仍然存在一个问题,行是按图像id排序的。我得到了这个错误>>消息156,级别15,状态1,第3行关键字“选择”附近的语法不正确。Msg 102,级别15,状态1,第17行“')”附近语法不正确。@AboudZakaria忘记了CTE和之间的关键字
(啊哈,知道了,它工作起来很有魅力,谢谢。现在唯一的问题是行再次按图像id排序
SELECT DISTINCT * FROM (
SELECT TOP 20 [image].Image_id, Source_Link
FROM Item
INNER JOIN [Image] ON Item.Image_id = [Image].Image_id
INNER JOIN Age_Item ON Item.Item_id = Age_Item.Item_id
WHERE Gender='male'
AND Age_Item.Age_id = 4
AND [Image].Image_id NOT IN
(
    SELECT [Image].Image_id
    FROM [Image]
    INNER JOIN Item on [Image].Image_id = Item.Image_id
    INNER JOIN Session_Item on Item.Item_id = Session_Item.Item_id
    WHERE Session_Item.Session_id = 3
)
ORDER BY NEWID()) query;
with cte as (

SELECT DISTINCT [image].Image_id, Source_Link
FROM Item
INNER JOIN [Image] ON Item.Image_id = [Image].Image_id
INNER JOIN Age_Item ON Item.Item_id = Age_Item.Item_id
WHERE Gender='male'
AND Age_Item.Age_id = 4
AND [Image].Image_id NOT IN
(
    SELECT [Image].Image_id
    FROM [Image]
    INNER JOIN Item on [Image].Image_id = Item.Image_id
    INNER JOIN Session_Item on Item.Item_id = Session_Item.Item_id
    WHERE Session_Item.Session_id = 3
)
)
Select TOP 20 DISTINCT * FROM CTE ORDER BY NEWID()