1

http://sqlfiddle.com/#!3/2506f/2/0を参照してください。

私は2つのテーブルを持っています。1 つは一般的なレコードで、もう 1 つはそのレコードにリンクする関連ドキュメントを含むテーブルです。

この例では、すべてのレコードとそれに関連付けられたドキュメントを表示する簡単なクエリを作成しました。これは問題ありませんが、もっと複雑な状況が必要です。

「mainrecord」テーブルには「multiple」フィールドがあります。これが 0 の場合、ドキュメント テーブルの最新のドキュメント (つまり、ID が最も高いもの) のみが必要です。1の場合、リンクされているすべてのドキュメントを結合したい。

したがって、クエリの結果が次のようになるのではなく:-

ID  NAME    MULTIPLE    DOCUMENTNAME    IDLINK
1   One     1           first document    1
1   One     1           second document   1
2   Two     0           third document    2
2   Two     0           fourth document   2
3   Three   1           fifth document    3
3   Three   1           sixth document    3

次のようになります。

ID  NAME    MULTIPLE    DOCUMENTNAME    IDLINK
1   One     1           first document    1
1   One     1           second document   1
2   Two     0           fourth document   2
3   Three   1           fifth document    3
3   Three   1           sixth document    3

この条件をクエリに含めて、求めている結果を取得する方法はありますか? 必要に応じてさらに説明していただければ幸いです。

前もって感謝します。

4

5 に答える 5

2
WITH myData
AS
(SELECT mainrecord.*, documentlinks.documentName, documentlinks.idlink,
Row_number()
                  OVER (
                    partition BY mainrecord.ID
                    ORDER BY mainrecord.ID ASC) AS ROWNUM
FROM mainrecord INNER JOIN documentlinks
ON mainrecord.id = documentlinks.idlink)
SELECT *
FROM mydata o
WHERE multiple = 0 AND rownum =
(SELECT max(rownum) FROM mydata i WHERE i.id = o.id)
UNION
SELECT *
FROM myData
WHERE multiple = 1

http://sqlfiddle.com/#!3/2506f/57

于 2012-11-02T11:23:23.943 に答える
2

別の解決策( SQL-Fiddleでテスト済み):

SELECT m.*, 
       d.id as did, d.documentName, d.IDLink
FROM mainrecord AS m
  JOIN documentlinks AS d
    ON  d.IDLink = m.id 
    AND m.multiple = 1 

UNION ALL

SELECT m.*, 
       d.id as did, d.documentName, d.IDLink
FROM mainrecord AS m
  JOIN
    ( SELECT d.IDLink
           , MAX(d.id) AS did
      FROM mainrecord AS m
        JOIN documentlinks AS d
          ON  d.IDLink = m.id 
          AND m.multiple = 0
      GROUP BY d.IDLink
    ) AS g
    ON g.IDLink = m.id 
  JOIN documentlinks AS d
    ON  d.id = g.did

ORDER BY id, did ;
于 2012-11-02T11:26:08.343 に答える
1

これはおそらく行うでしょう:

SELECT mainrecord.name, documentlinks.documentname
FROM documentlinks
INNER JOIN mainrecord ON mainrecord.id = documentlinks.IDLink AND multiple = 1

UNION

SELECT mainrecord.name, documentlinks.documentname
FROM (SELECT max(id) id, IDLink FROM documentlinks group by IDLink) maxdocuments
INNER JOIN documentlinks ON documentlinks.id = maxdocuments.id
INNER JOIN mainrecord ON mainrecord.id = documentlinks.IDLink AND multiple = 0
于 2012-11-02T11:24:12.047 に答える
0

これはどう:

select * from mainrecord a inner join documentlinks b on a.Id=b.IDLink 
where b.id=(case 
   when a.multiple=1 then b.id 
   else (select max(id) from documentlinks c where c.IDLink=b.IDLink) end)
于 2012-11-02T11:31:02.713 に答える
0

SQL フィドル

select
    m.ID, m.name, m.multiple, dl.idlink,
    dl.documentName
from mainrecord as m
    left outer join documentlinks as dl on dl.IDlink = m.id
where
    m.multiple = 1 or 
    not exists (select * from documentlinks as t where t.idlink = m.id and t.id < dl.id)
于 2012-11-02T11:18:11.567 に答える