2011-02-01 4 views
0

でラウンド行く私は、次のTricklyは、必要なSQLをしてください取引:円

Ftitle    Fvalue       Freference 
------    ----------      --------- 
filename    file1.java      123 
version    2        123 
cvstree    branch1      123 

filename    file2.java      345 
version    4        345 
cvstree    branch2      345 

filename    file1.java      4556 
version    3        4556 
cvstree    branch1      4556 


filename    file3.java      4312 
version    77        4312 
cvstree    branch2      4312 

filename    file1.java      5616 
version    1        5616 
cvstree    branch3      5616 

のようなデータを持っている私は、簡単に読みやすくするためにいくつかの列の間に上記の空白行を与えています。さまざまな理由から、テーブル構造を変更することはできず、テーブルにはトンとトンのデータが含まれています。

今、私が持っているものは、例としてfile1.javaのFvalueです。私はTSQLステートメントを使用できるかどうかを知りたいので、1つのクエリで、たとえばブランチが指定したものと一致するすべての個別のFreference値を取得します。

たとえば、もし私がbranch1のfile1.javaにマッチしたいクエリを与えたら、SQLは "Freference" 4556と123を返すだけです。

file.javaのすべての「Freference」値をループせずに、Fvalueがbranch1の場合はさらにフィルタリングすることができますか?この種のループは非常に遅くなります。

+1

TSQL = SQL Server? – gbn

+1

は、各トリプレットに固有のFreferenceですか?言い換えれば、他の行の集合は4312をFreferenceとして持つことができますか? – Randy

答えて

1
select * 
from theTable 
where Ftitle = 'file1.java' 
and Fvalue = 'branch1' 
+0

Ftitleは決してfile1.javaではありません。 –

+0

"Ftitle"はそれとは関係ありません – gbn

3
SELECT --DISTINCT intersect removes duplicates 
    Freference 
FROM 
    MyTable M1 
WHERE 
    M1.Fvalue = 'file1.java' 
INTERSECT 
SELECT --DISTINCT intersect removes duplicates 
    Freference 
FROM 
    MyTable M2 
WHERE 
    M2.Fvalue = 'branch1' 

OR

SELECT DISTINCT 
    M.Freference 
FROM 
    MyTable M 
WHERE 
    M.Fvalue = 'file1.java' 
    AND 
    EXISTS (SELECT * FROM 
      MyTable M2 
     WHERE 
      M2.Fvalue = 'branch1' 
      AND 
      M.Freference = M2.Freference) 
+0

どちらのクエリも適切にテーブルを参照していません – RichardTheKiwi

+1

まだ1つの小さな間違いがあります(最初のクエリのMyTable Mはおそらく 'MyTable M1'です)。もう1つ:INTERSECT 'は、INTERSECTオペランドの左右の両方のクエリによって返される* distinct *値をMSDN(http://msdn.microsoft.com/en-us/library)に従って返します。 /ms188055.aspx)。つまり、明示的なDISTINCTは必要ありません。 –

+0

@Andriy M:ありがとう、固定 – gbn

2

あなただけの自分自身に、テーブルに参加したい、それは非常に簡単です。

編集:これはいかがですか?

select a.Freference 

from table a inner join table b 
     on a.Freference = b.Freference 
     and a.Ftitle = 'filename' 
     and b.Ftitle = 'cvstree' 
where 
    a.Fvalue ='file1.java' 
    and b.Fvalue = 'branch1' 
3

INTERSECTはオプション
である。しかし、直接参加DBMS間でより良いサポートしています。

select distinct a.freference 
from tbl a 
inner join tbl b on a.freference = b.freference and b.fvalue = 'branch1' 
where a.fvalue = 'file1.java' 
+0

@gbnこれは動作します。これは共通のキーではなく、最初の結果セットをサブセット化することのみを意味します。 – RichardTheKiwi

+0

ええ、私は自分自身を推測しています – gbn

+0

味の問題として、私は両方のフィルタを1つの節に置きます。おそらくWHEREにあります。彼らはそこにいるようです。 –

0

は、各トリプレットにFreferenceユニークなのですか? つまり、その他のセットの 行には4312がFreferenceとして表示されますか?

はい、自由度は各トリプレットに固有です。申し訳ありませんが、私は前に言及していない場合。私はその間に様々なアイデアを試しています

関連する問題