【问题标题】:Which Join is needed for this query in SQL ServerSQL Server 中的此查询需要哪个联接
【发布时间】:2017-07-15 18:48:15
【问题描述】:

我需要返回分页结果,即来自名为属性的表中的后五个记录。此查询单独使用:

SELECT  
    Property_ID, 
    Property_Type, 
    Address_Line, 
    Area, 
    Postcode, 
    Weekly_Rate 
FROM
    dbo.Properties 
WHERE   
    Area LIKE '%" + value + "%' 
ORDER BY 
    Property_ID 
    OFFSET " + (start*end) + " ROWS 
    FETCH NEXT " + end + " ROWS ONLY"

上面的代码是用C#编写的。

但我还需要 Images 表中引用分页子集中返回的每条记录的第一个 Image ID。

我尝试了 FULL OUTER JOIN 并没有返回预期的结果,可能是因为每个属性有多个图像。

任何解决方案都会很棒!

谢谢

这似乎几乎可以工作,但它返回一个错误:

SELECT 
    dbo.Properties.Property_ID, Property_Type, dbo.Images_Table.[URL]
FROM 
    dbo.Properties p 
OUTER APPLY
    (SELECT TOP 1 i.*
     FROM dbo.Images_Table i
     WHERE i.Property_ID = p.Property_ID
     ORDER BY i.Image_ID) i
WHERE 
    p.Area LIKE '%po%' 
ORDER BY 
    p.Property_ID 
    OFFSET 0 ROWS 
    FETCH NEXT 5 ROWS ONLY

这是返回的错误:

消息 4104,第 16 级,状态 1,第 1 行
无法绑定多部分标识符“dbo.Properties.Property_ID”。

消息 4104,第 16 级,状态 1,第 1 行
无法绑定多部分标识符“dbo.Images_Table.URL”。

【问题讨论】:

  • Properties 表和Images 表有什么关系?表模式会很好看。
  • Property_ID 是 Images 表中的外键

标签: c# sql-server join pagination


【解决方案1】:

你可以使用outer apply:

SELECT . . . , i.??
FROM dbo.Properties p OUTER APPLY
     (SELECT TOP 1 i.*
      FROM images i
      WHERE i.Property_ID = p.Property_ID
      ORDER BY i.Image_ID
     ) i
WHERE p.Area LIKE '%" + value + "%' 
ORDER BY p.Property_ID 
OFFSET " + (start*end) + " ROWS 
FETCH NEXT " + end + " ROWS ONLY";

这有点推测您如何订购图像。您还需要从images 表中填写您想要的列。

【讨论】:

  • 我在 sql-server 中写了这个:
  • SELECT dbo.Properties.Property_ID、Property_Type、dbo.Images_Table.[URL] FROM dbo.Properties p 外部应用(选择 TOP 1 i.* FROM dbo.Images_Table i WHERE i.Property_ID = p. Property_ID ORDER BY i.Image_ID ) i WHERE p.Area LIKE '%po%' ORDER BY p.Property_ID OFFSET " + (start*end) + " ROWS FETCH NEXT " + end + " ROWS ONLY
  • Msg 4104,级别 16,状态 1,行 1 无法绑定多部分标识符“dbo.Properties.Property_ID”。消息 4104,级别 16,状态 1,行 1 无法绑定多部分标识符“dbo.Images_Table.URL”。消息 207,级别 16,状态 1,第 11 行无效的列名 '+end +'。消息 207,级别 16,状态 1,第 10 行无效的列名 ' + (start*end) + '。
  • 我错过了什么对不起?
  • @Kieran 。 . .我不知道。您的答案中的查询看起来与此答案中的查询非常相似——一旦插入参数。
猜你喜欢
  • 2015-04-07
  • 2011-02-22
  • 1970-01-01
  • 2023-03-20
  • 2020-09-10
  • 1970-01-01
  • 2011-12-16
  • 1970-01-01
  • 2016-12-31
相关资源
最近更新 更多