需要狡猾的交易SQL:围成一圈

时间:2011-02-01 19:24:52

标签: sql sql-server tsql

我有以下数据

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

我在某些行之间给出了一个空白行,以便于阅读。由于各种原因,表格结构无法更改,表格中包含大量数据和大量数据。

现在,我所拥有的只是Fvalue,例如file1.java。我想知道我是否可以使用TSQL语句,以便在单个查询中获得,例如所有不同的Freference值,其中分支与我指定的匹配。

所以,例如,如果我给出一个查询,我想为branch1的file1.java匹配,那么我只想让SQL返回“Freference”4556和123。

如果不循环遍历file.java的所有“Freference”值,然后在Fvalue为branch1的地方进一步过滤,这是否可行?这种循环变得非常慢。

5 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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'

答案 2 :(得分: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 :(得分:1)

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

答案 4 :(得分:0)

  

是每个三联体特有的游离度?   换句话说,可以任何其他一组   行有4312作为Freference?

是的,Freference对每个三元组都是唯一的。对不起,如果我之前没有提到。我在此期间尝试各种想法