C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

SQLでのデータ取得方法について

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■89895 / inTopicNo.1)  SQLでのデータ取得方法について
  
□投稿者/ ルパン (12回)-(2019/01/15(Tue) 16:57:07)

分類:[.NET 全般] 

以下のような感じでデータがある場合に

PNAME CNAME
A B A
A E ├B
B E │└E
C F │ ├G
E G │ └H
E H └E
 ├G
   └H

以下の方法でデータをとってきています。

DECLARE @PNAME VARCHAR(20) = 'A';

WITH CTE (
PNAME, CNAME
)
AS (
SELECT PNAME, CNAME
FROM M_TREE
WHERE PNAME = @PNAME
UNION ALL
SELECT T2.PNAME, T2.CNAME
FROM M_TREE AS T2
INNER JOIN CTE
ON CTE.CNAME = T2.PNAME
)
SELECT DISTINCT *
FROM CTE

現在このデータが数万行あり
DISTINCT が遅いのでEXISTS を使うなど
別の方法で高速にとってこれますか?

また、とってきたデータが以下の順番でとってこれますか?
PNAME CNAME A
A B ├B
B E │└E
E G │ ├G
E H │ ├H
A E └E
E G  ├G
E H  └H



引用返信 編集キー/
■89899 / inTopicNo.2)  Re[1]: SQLでのデータ取得方法について
□投稿者/ 魔界の仮面弁士 (2011回)-(2019/01/15(Tue) 19:44:35)
No89895 (ルパン さん) に返信
> DECLARE @PNAME VARCHAR(20) = 'A';
どのデータベース製品のどのバージョンを
用いているのかも示した方が良いですよ。


> 以下のような感じでデータがある場合に
元データには 'C' - 'F' のノードもあるのですよね?
条件から漏れているので抽出されないというだけで。



> また、とってきたデータが以下の順番でとってこれますか?
あまり検証してないですが、これでどうかな…。
とりあえず、手元にあった SQL Server 2008 R2 で組んでみました。


CREATE TABLE M_TREE
( PNAME VARCHAR(20) NOT NULL
, CNAME VARCHAR(20) NOT NULL
, CONSTRAINT PX_M_TREE PRIMARY KEY (PNAME, CNAME)
);

INSERT INTO M_TREE VALUES
('A', 'B'),
('A', 'E'),
('B', 'E'),
('C', 'F'),
('E', 'G'),
('E', 'H');

DECLARE @PNAME VARCHAR(20) = 'A';
DECLARE @SEPARATOR CHAR(1) = '/';


WITH CTE (PNAME, CNAME, DEPTH, PATH) AS (
SELECT PNAME, CNAME, 1, CAST(PNAME + @SEPARATOR + CNAME AS VARCHAR(MAX))
FROM M_TREE WHERE PNAME = @PNAME
UNION ALL
SELECT T2.PNAME, T2.CNAME, CTE.DEPTH + 1, CTE.PATH + @SEPARATOR + T2.CNAME
FROM M_TREE AS T2 INNER JOIN CTE ON CTE.CNAME = T2.PNAME
) SELECT * FROM CTE ORDER BY PATH;

引用返信 編集キー/
■89909 / inTopicNo.3)  Re[2]: SQLでのデータ取得方法について
□投稿者/ ルパン (13回)-(2019/01/16(Wed) 10:24:18)
2019/01/16(Wed) 14:24:50 編集(投稿者)

No89899 (魔界の仮面弁士 さん) に返信
ありがとうございました。
この方法でデータを取得することができました。

でもすみません。
実際のデータで試してみたところ
6秒で取得していたデータが、40秒かかってしまいました。
なにか別の手を考えます。

解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ