2009-07-06 4 views
0

私はすでにT-SQL(カーソル&ループ)を使用して解決される問題を持っている。(SQLサーバー2005)表示SQLクエリを使用してマスター/マスター・ディテール表からのレコードのみ

しかし、私は解決策を探していますSQLを使用します。

私は列を持つマスター表を持っているがMasterRecord(すべてがユニークとタイプVARCHARおよびPKです)

MasterRecord 
------------ 
MRecord1 
MRecord2 
MRecord3 
MRecord4 
................ 
.................. 
MRecord[n] 

今すぐマスター詳細テーブルが2列MasterRecord(varchar型& FK)とDetailRecord(varchar型を持っていると言います)[n]は、任意の数

問題は、各固有マスタレコードのために、私はトップ2をフェッチする必要があることであることができる

MasterRecord   DetailRecord 
--------------------------------------------- 
MRecord1    MRecord1_DetailRecord1 
MRecord1    MRecord1_DetailRecord2 
MRecord1    MRecord1_DetailRecord3 
MRecord1    MRecord1_DetailRecord4 
MRecord2    MRecord2_DetailRecord1 
MRecord2    MRecord2_DetailRecord2 
MRecord2    MRecord2_DetailRecord3 
MRecord2    MRecord2_DetailRecord4 
............................................... 
................................................ 
MRecord[n]   MRecord[n] _DetailRecord1 
MRecord[n]   MRecord[n] _DetailRecord2 
MRecord[n]   MRecord[n] _DetailRecord3 
MRecord[n]   MRecord[n] _DetailRecord4 

詳細レコード

O/P:

MasterRecord   DetailRecord 
--------------------------------------------- 
MRecord1    MRecord1_DetailRecord1 
MRecord1    MRecord1_DetailRecord2 
MRecord2    MRecord2_DetailRecord1 
MRecord2    MRecord2_DetailRecord2 
MRecord3    MRecord3_DetailRecord1 
MRecord3    MRecord3_DetailRecord2 
............................................... 
.............................................. 
MRecord[n]   MRecord[n] _DetailRecord1 
MRecord[n]   MRecord[n] _DetailRecord2 

希望私ははっきりと私の問題を説明しました。

詳細をお知らせください。

+0

を役に立てば幸い?どの言語/フレームワークですか? .net/java/vb6? winforms/asp.net/silverlight? – shahkalpesh

+0

それはSQLサーバー2005です。私はそれをDataGridに表示したいと思います。それはAsp.netアプリケーションです。しかし、問題はバックエンドだけで解決する必要があります。私は(上司の指示に従って)コードの背後でそれを処理するはずがありません。 –

答えて

2

あなたは1と2でちょうど2つのレコードまたはレコードを望んでいたかどうかわからない:スペルタイプミスに

編集を修正しました。

ここをクリックしてお知らせください。

DECLARE @Master TABLE(
     MasterRecordID VARCHAR(20) 
) 

INSERT INTO @Master (MasterRecordID) VALUES ('MASTER1') 
INSERT INTO @Master (MasterRecordID) VALUES ('MASTER2') 
INSERT INTO @Master (MasterRecordID) VALUES ('MASTER3') 
INSERT INTO @Master (MasterRecordID) VALUES ('MASTER4') 

DECLARE @MasterDetail TABLE(
     MasterRecordID VARCHAR(20), 
     MasterDetailRecord VARCHAR(50) 
) 

INSERT INTO @MasterDetail (MasterRecordID,MasterDetailRecord) VALUES ('MASTER4','MASTERDETAIL10') 

INSERT INTO @MasterDetail (MasterRecordID,MasterDetailRecord) VALUES ('MASTER3','MASTERDETAIL09') 
INSERT INTO @MasterDetail (MasterRecordID,MasterDetailRecord) VALUES ('MASTER3','MASTERDETAIL08') 
INSERT INTO @MasterDetail (MasterRecordID,MasterDetailRecord) VALUES ('MASTER3','MASTERDETAIL07') 

INSERT INTO @MasterDetail (MasterRecordID,MasterDetailRecord) VALUES ('MASTER2','MASTERDETAIL06') 
INSERT INTO @MasterDetail (MasterRecordID,MasterDetailRecord) VALUES ('MASTER2','MASTERDETAIL05') 
INSERT INTO @MasterDetail (MasterRecordID,MasterDetailRecord) VALUES ('MASTER2','MASTERDETAIL04') 

INSERT INTO @MasterDetail (MasterRecordID,MasterDetailRecord) VALUES ('MASTER1','MASTERDETAIL03') 
INSERT INTO @MasterDetail (MasterRecordID,MasterDetailRecord) VALUES ('MASTER1','MASTERDETAIL02') 
INSERT INTO @MasterDetail (MasterRecordID,MasterDetailRecord) VALUES ('MASTER1','MASTERDETAIL01') 

DECLARE @MaxRecords INT 
SELECT @MaxRecords = 2 

SELECT md.MasterRecordID, 
     md.MasterDetailRecord 
FROM @MasterDetail md INNER JOIN 
     --this section ensures that we only return master records with at least MaxRecords as specified (2 in your case) 
     --if you wish to display al master records, with 1, 2 or MaxRecords, romove this section or see below 
     (
      SELECT MasterRecordID 
      FROM @MasterDetail 
      GROUP BY MasterRecordID 
      HAVING COUNT(MasterRecordID) >= @MaxRecords 
     ) NumberOfRecords ON md.MasterRecordID = NumberOfRecords.MasterRecordID INNER JOIN 
     @MasterDetail mdSmaller ON md.MasterRecordID = mdSmaller.MasterRecordID 
WHERE mdSmaller.MasterDetailRecord <= md.MasterDetailRecord 
GROUP BY md.MasterRecordID, 
      md.MasterDetailRecord 
HAVING COUNT(mdSmaller.MasterDetailRecord) <= @MaxRecords 
ORDER BY md.MasterRecordID, 
      md.MasterDetailRecord 



SELECT md.MasterRecordID, 
     md.MasterDetailRecord 
FROM @MasterDetail md INNER JOIN 
     --this will ensure that all master records will return with 1, 2 or MaxRecords 
     @MasterDetail mdSmaller ON md.MasterRecordID = mdSmaller.MasterRecordID 
WHERE mdSmaller.MasterDetailRecord <= md.MasterDetailRecord 
GROUP BY md.MasterRecordID, 
      md.MasterDetailRecord 
HAVING COUNT(mdSmaller.MasterDetailRecord) <= @MaxRecords 
ORDER BY md.MasterRecordID, 
      md.MasterDetailRecord 

マスター・ディテール形式で表示したいん

0

今は完全なクエリを書き出す時間がありませんが、マスターテーブルから開始して詳細テーブルに2回参加してください。最初の結合は、各マスターレコードの先頭のレコード(ここではlesser = 0、特定の定義ではlesser)に一致し、2番目の結合は2番目のレコードと一致する必要があります)。私はそれについて考えると、あなたは追加のレコードを取得するために労働組合を行う必要があるでしょう

更新
(まだ同じことを書くに参加していますが、労働組合を経由して結果に含める完全に別の選択クエリで)。それ以外の場合は、同じレコードの最初の詳細キーと2番目の詳細キーの両方を使用して出力を戻す必要があります。

3

これを試してみてください:

WITH cteCount as 
(
    Select 
     ROW_NUMBER() OVER(PARTITION BY MRecord ORDER BY MR_DETAIL_COLUMN) as TopCnt, 
     MR_DETAIL_COLUMN 
    FROM MASTER_DETAIL_TABLE 
) 
SELECT 
     * 
FROM MASTER_TABLE as MT 
JOIN cteCount as MDT ON MDT.MRecord = MT.MRecord 
WHERE TopCnt <= 2 

編集:修正本当にばかなミス

+0

このエラーが発生しました メッセージレベル102、レベル15、状態1、行3 'PARTITON'付近の構文が正しくありません。 –

+0

PARTITIONのスペルが間違っていました。 – RBarryYoung

+1

@RBarryYoungそれはそのまま動作するはずですか?私は自分のニーズを理解しようとしています。2番目のクエリはcteCountのtopcntについてどのように知っていますか?最初のクエリではカンマがありませんか? – MicMit

関連する問題