SQL内部联接使用where {order

时间:2017-07-21 01:05:31

标签: sql sql-server tsql inner-join

我必须使用带有许多过滤器的TSQL编写复杂的搜索查询并对其进行分页,并在同一查询中对它们进行排序。我有2个表,彼此之间有一对一的关系,并尝试使用内连接。

  

第一个名为 dbo.Products 的表,其中包含以下列: Id,Name,   价格,型号颜色

     

第二个表名为 dbo.Items ,其中包含以下列: Id,   products_Id,Tel,Area,Category Date

我需要从表中选择 ID,类别,日期和区域,然后从产品中选择名称,价格和模型表。这是我的镜头:

SELECT Id,Category,Date,Name,Price,Model
FROM dbo.Items
INNER JOIN dbo.Products ON dbo.Items.Id=dbo.Products.Id
WHERE Category=1 AND Name LIKE '%is%' AND Price<1000 AND Area=2
ORDER BY Date DESC
ORDER BY [Id] OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY

我的第一个问题是订单是否正确,第二个问题是有更好的方法来编写它以获得更好的性能,比如使用存储过程吗?

2 个答案:

答案 0 :(得分:0)

正确的语法是:

SELECT I.Id,Category,Date,Name,Price,Model
FROM dbo.Items as I
INNER JOIN dbo.Products as P ON I.Id=P.Id
WHERE Category=1 AND Name LIKE '%is%' AND Price<1000 AND Area=2
ORDER BY Date DESC, I.[Id] OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY

答案 1 :(得分:0)

我根据您对表结构的假设更新了您的查询。我把dbo留在桌子上,虽然我通常不用dbo查询表。它通常由相关架构拥有。

  • 问题1:您不能运行两个ord​​er by子句,您需要用排序优先级逗号分隔它们。

  • 问题2:我重写了下面的查询。

  • 您的查询也有DEC,我认为您的意思是降序(DESC)。

  • 我还将两个ord​​er by子句合并为一个逗号排名 他们。
  • 我把桌子别名了。这有助于缓解您正在使用的表格的混淆,并使其更具可读性。
  • 我将where子句“其中p.Name如'%is%'移动到where子句的底部。这可以帮助您在查询可索引和更快的过滤器时加快查询速度并减少行之类的东西会反对。

    SELECT i.Id,i.Category,i.Date,p.Name,p.Price,p.Model
        FROM dbo.Items i
            INNER JOIN dbo.Products p ON i.Id=p.Id
        WHERE i.Category=1 
            AND p.Price<1000 
            AND i.Area=2
            AND p.Name LIKE '%is%' 
        ORDER BY i.Datum DESC, [i.Id] OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY