2017-10-28 86 views
0

一个查询结果这是从一个表的摘录:SQL使用来自另一个查询

| id | type | other_id | def_id | ref_def_id| 
| 1 | int  | NULL  | 5  | NULL  | 
| 2 | string | NULL  | 5  | NULL  | 
| 3 | int  | NULL  | 5  | NULL  | 
| 20 | ref  | 3  | NULL | 5  | 
| 21 | ref  | 4  | NULL | 5  | 
| 22 | ref  | 5  | NULL | 5  | 

我要的是找到与类型REF条目。然后我就比如在我的结果这一个条目:

| 22 | ref  | 5  | NULL | 5  | 

我现在面临的问题是,我现在想用相同的表,其中def_id = 5

的其他条目此条结合所以我会得到def_id = 5的所有条目作为结果。我以某种方式需要从我的第一个查询输出,检查什么是ref_def_id,然后对此ID进行另一个查询。

我真的很难理解如何继续。任何输入都非常感谢。

回答

0

你似乎要聚集:

select max(id) as id, type, max(other_id) as other_id, 
     max(def_id) as def_id, ref_def_id 
from t 
where type = 'ref' 
group by type, ref_def_id 
+0

关于上述情况,当我尝试做这个查询时,我得到错误响应,有一个unkonwn列ref。任何想法? – curlie

+0

@curlie。 。 。这应该是在'group by'中的'type'。 –

1

如果我理解正确的话,你需要找到的“参考”一type行,然后使用自己的ref_def_id列中的值与同来获取行值在def_id。在这种情况下,你需要使用一个子查询与“裁判”类型获取行和使用任何INEXISTS结合起来:

select * 
from YourTable 
where def_id in (select ref_def_id from YourTable where type='ref'); 

select * 
from YourTable 
where exists (select * from YourTable yt 
    where yt.ref_def_id=YourTable.def_id and yt.type='ref') 

两个查询是等价的,IN是乍看起来更容易理解,但EXISTS允许更复杂的条件(例如,您可以使用多个列与子查询组合)。

编辑:因为你评论,你还需要从“裁判”行id,那么你需要使用子查询:

select source_id, YourTable.* 
from YourTable 
join (select id as source_id, ref_def_id 
     from YourTable 
     where type='ref') 
as refs on refs.ref_def_id=YourTable.def_id 
order by source_id, id; 

有了这个每个“裁判”行,你会得到一切与关联的行ref_id

+0

非常感谢,这对我帮助很大。现在我看到另一个问题。是否有可能跟踪条目属于哪种类型?例如,如果我想查看ID 20,请输入ref,other_id 3的所有相关信息。查询完美,但我注意到,我需要有一个轨道。现在我得到所有refs的查询结果,我没有看到他们属于哪个初始ID。我的解释清楚了吗?如果你有任何解决方法,谢谢你的帮助 – curlie

+0

我想我明白了,你需要获得ref_def_id的那一行的id,但问题是你的样本数据会得到很多组合。我的意思是,当你在列中有重复的值时,你会得到每个def_id值的*(重复的ref_def_id计数)×(重复的def_id计数)*行。例如,对于ref_def_id = 5,您将得到9个结果行,即*(3行,def_id = 5)x(3行,ref_def_id = 5)*。我这是你想要的? –

+0

是的,它会进入这个方向。当我为id 20做一个查询时,那么我应该取回3行,因为value为ref,ref_def_id为5,并且有3行,其中def_id的值为5.您可以想象得到,ref_def_id是对def_id,因此当我在ref_def_id不是NULL的情况下进行查询时,总是有一个对这个def_id列的引用。这是我遇到的问题... – curlie

相关问题