2017-05-29 13 views
1

私はいくつかの情報をクエリしようとしていますが、クエリが出てこないようです。以下は、テーブル情報と私の現在のクエリです。SQL Serverの単一クエリの問題

会社テーブル:

+-----------+-----------+------------+ 
| CompanyID | Address | PostalCode | 
+-----------+-----------+------------+ 
| a-coy  | 31 street |  111111 | 
| b-coy  | 32 street |  111222 | 
+-----------+-----------+------------+ 

修復表:

+----------+-----------+----------------+------------+----------+ 
| SerialNo | CompanyID | PersonInCharge | RepairDate | RepairBy | 
+----------+-----------+----------------+------------+----------+ 
| 15000 | a-coy  | John   | 01-May-17 | Jason | 
| 15001 | a-coy  | John   | 02-May-17 | Jack  | 
+----------+-----------+----------------+------------+----------+ 

私の目的は、最新の修復が1つだけの結果を持っているエントリを作品からクエリを描画することです。

SELECT 
    c.companyid, c.address, r.repairdate, r.repairby 
FROM 
    company c 
INNER JOIN 
    repair r ON c.companyID = r.companyID 
WHERE 
    c.companyid = 'a-coy' 

と私は次のような結果を得る:以下のように

私の現在のクエリがある

+-----------+-----------+------------+----------+ 
| CompanyID | Address | RepairDate | RepairBy | 
+-----------+-----------+------------+----------+ 
| a-coy  | 31 street | 01-May-17 | Jason | 
| a-coy  | 31 street | 02-May-17 | Jack  | 
+-----------+-----------+------------+----------+ 

しかし、私が望んでいた結果では、最新の修理日付でばかりのエントリであり、それは希望まさに次のようになります。

+-----------+-----------+------------+----------+ 
| CompanyID | Address | RepairDate | RepairBy | 
+-----------+-----------+------------+----------+ 
| a-coy  | 31 street | 02-May-17 | Jack  | 
+-----------+-----------+------------+----------+ 

答えて

2
SELECT TOP 1 
c.companyid, 
c.address, 
r.repairdate, 
r.repairby 
FROM company c 
INNER JOIN repair r ON c.companyID=r.companyID 
WHERE c.companyid = 'a-coy' 
ORDER BY r.repairdate DESC 
+0

はい。これを実稼働環境で正しく実行するには、修理日にインデックスを必ず追加してください。 – arboreal84

+0

インデックスが不要な場合は作成しないでください。あなたのクエリを試してみてください。インデックスを作成しないでください。インデックスが多すぎると挿入/更新文が遅くなる可能性があります – GuidoG

+0

貴重な助けをいただきありがとうございます。心から感謝する。 – LKH

-1

1つのオプションは、ROW_NUMBER()を使用して、各会社の最新の修理日を特定することです。

SELECT 
    t.companyid, 
    t.address, 
    t.repairdate, 
    t.repairby 
FROM 
(
    SELECT 
     c.companyid, 
     c.address, 
     r.repairdate, 
     r.repairby, 
     ROW_NUMBER() OVER (PARTITION BY c.companyid ORDER BY r.repairdate DESC) rn 
    FROM company c 
    INNER JOIN repair r 
     ON c.companyID = r.companyID 
) t 
WHERE t.rn = 1 AND 
     t.companyid = 'a-coy' 

これは、複数の会社の最新の修理記録を取得する場合に適しています。もう1つの答えは1つの企業ではうまくいくが、複数の企業ではうまく調整できない。

+0

貴重な助けをいただきありがとうございます。心から感謝する。 – LKH

+0

なぜコメントなしでこれを下降させたのですか? –