2017-09-04 31 views
0

私はこれらの2つのSQLクエリを組み合わせるのに苦労しています。 2つのテーブルからデータを選択するオリジナルのクエリがあり、関連する列はTasks.CustomerIDとCustomers.CustomerIDです。それは基本的にタスクです。* + Customers.Nameこれらの2つの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」というエラーがあります。

ご不便をおかけして申し訳ございませんが、ご迷惑をおかけして申し訳ございません。

+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

ブライアンありがとう!私は返信を感謝します! –

関連する問題