2017-09-04 143 views
0

我有困扰结合这两个SQL查询。我有这个原始查询从两个表中选择数据,相关的列是Tasks.CustomerID和Customers.CustomerID。它基本上任务。* + Customers.Name结合这两个SQL查询

ALTER PROCEDURE [dbo].[SP_SelectTasksandName] 
AS 
SELECT TASKS.CustomerID, TASKS.DateCreation, TASKS.DateFinish, TASKS.Description, TASKS.Fees, TASKS.Hours, TASKS.InvoiceNum, TASKS.PaymentMethod, 
     TASKS.Status, TASKS.TaskID, CUSTOMERS.Name 
FROM TASKS, CUSTOMERS 
WHERE (TASKS.CustomerID LIKE CUSTOMERS.CustomerID) 

这工作,但现在我已经被要求限制此查询到指定的行数量。我发现这个代码适用于其他更简单的查询,但我似乎无法正确使用此查询。此限制代码如下。 (即所有行> @low & &行< = @high)

SELECT * FROM (
    SELECT *, ROW_NUMBER() OVER (ORDER BY CustomerID) as row FROM CUSTOMERS 
    ) a WHERE ((a.row > @low and a.row <= @high) 

这是最接近我已经得到了,但我在这里卡住。

SELECT * FROM (
    SELECT *, ROW_NUMBER() OVER (ORDER BY TASKS.CustomerID) as row FROM 
     (SELECT TASKS.CustomerID, TASKS.DateCreation, TASKS.DateFinish, TASKS.Description, TASKS.Fees, TASKS.Hours, TASKS.InvoiceNum, TASKS.PaymentMethod, 
       TASKS.Status, TASKS.TaskID, CUSTOMERS.Name 
     FROM TASKS, CUSTOMERS 
     WHERE (TASKS.CustomerID LIKE CUSTOMERS.CustomerID)) 

) a WHERE (a.row > @low and a.row <= @high) 

在最后一行的第一个括号上出现“期待为id或带引号的id”错误。

对不起noob问题,感谢任何帮助你们可以给。

+0

*行*被设定为在未来可能的[TSQL保留字MSSQL版本](https://docs.microsoft.com/en-us/sql/t-sql/language-elements/reserved-keywords-transact-sql#future-keywords)。考虑用方括号或不同的别名进行转义。你为什么不用通配符使用'LIKE'?使用显式的'INNER JOIN'。 – Parfait

+0

感谢您的评论,我的SQL绝对是马虎!我需要为此努力。 –

+0

备注:您应该**不要**为存储过程使用'sp_'前缀。微软已经保留了这个前缀以供自己使用(参见*命名存储过程*)](http://msdn.microsoft.com/en-us/library/ms190669%28v=sql.105%29.aspx),以及你将来有可能冒着名字冲突的风险。 [这对你的存储过程性能也是不利的](http://www.sqlperformance.com/2012/10/t-sql-queries/sp_prefix)。最好只是简单地避免使用'sp_'并将其他内容用作前缀 - 或者根本没有前缀! –

回答

1

从不FROM条款中使用逗号。 始终使用使用正确的,明确的JOIN语法。

你正在寻找的查询可以写成:

SELECT tc.* 
FROM (SELECT t.CustomerID, t.DateCreation, t.DateFinish, t.Description, 
      t.Fees, t.Hours, t.InvoiceNum, t.PaymentMethod, 
      t.Status, t.TaskID, c.Name, 
      ROW_NUMBER() OVER (ORDER BY t.CustomerID) as seqnum 
     FROM TASKS t JOIN 
      CUSTOMERS c 
      ON t.CustomerID = c.CustomerID 
    ) tc 
WHERE tc.seqnum > @low ANDtc.seqnum <= @high 
+0

它说不要评论谢谢,但谢谢!对此,我真的非常感激。绝对需要处理我的SQL风格。你是一个传奇! –

0

如下我会写查询:

;With CTE 
As 
(
    SELECT 
     TASKS.CustomerID, 
     TASKS.DateCreation, 
     TASKS.DateFinish, 
     TASKS.Description, 
     TASKS.Fees, 
     TASKS.Hours, 
     TASKS.InvoiceNum, 
     TASKS.PaymentMethod, 
     TASKS.Status, 
     TASKS.TaskID, 
     CUSTOMERS.Name, 
     Row_Number() over (Partition By Tasks.CustomerID Order by Tasks.CustomerID) as RN 
    FROM TASKS 
     Inner Join CUSTOMERS 
      on (TASKS.CustomerID = CUSTOMERS.CustomerID) 
    ) 
select * -- just being lazy here - in production code you ALWAYS use an explicit field list 
from CTE 
Where CTE.RN > @low and CTE.RN <= @high -- or whatever logic you need 
+0

谢谢Brian!我很欣赏这个回复! –