SQL:如何在内部选择上添加条件
因此,对于一个LINK_ID,我有几个代码和几个admin_class+优先级raw 但在结果集中,每个链接id只需要一行: 链接id和管理类,表示最小优先级。 我尝试使用sql语句,如下所示:SQL:如何在内部选择上添加条件,sql,select,Sql,Select,因此,对于一个LINK_ID,我有几个代码和几个admin_class+优先级raw 但在结果集中,每个链接id只需要一行: 链接id和管理类,表示最小优先级。 我尝试使用sql语句,如下所示: 1. links: link_id, road 2. roads: road, code 2. admin_classes: code, admin_class, priority select l.link_id, ac.admin_class, min(ac.priority) from base
1. links: link_id, road
2. roads: road, code
2. admin_classes: code, admin_class, priority
select l.link_id, ac.admin_class, min(ac.priority)
from base.links as l
inner join base.admin_classes as ac
on ac.code=l.code
where ac.admin_class<>0
这是正确的,但我不知道如何在内部选择上添加条件,我只需要具有admin_class0的RAW
我使用PostgreSql 8.3
提前谢谢。这不起作用吗
select l.link_id, (select ac.admin_class from base.admin_classes as ac where ac.code=l.code
order by ac.priority limit 1) as admin_class from base.links as l
内部连接base.admin\u类作为ac
在ac.code=l.code和ac.admin\u类0上
我不熟悉postgresql,但我猜原始查询不起作用,因为您有一个min()
聚合函数,没有groupby
但是,如果您不需要min()
,则以下操作应该可以:
选择l.link\u id,ac.admin\u类
从base.links到l
内部连接base.admin_类作为ac
在ac.code=l.code上
和ac.admin_class0
否则,请尝试:
select l.link_id, ac.admin_class
from base.links as l
inner join base.admin_classes as ac
on ac.code=l.code
and ac.admin_class<>0
选择l.link\u id,ac.admin\u class,min(ac.priority)
从base.links到l
内部连接base.admin_类作为ac
在ac.code=l.code上
和ac.admin_class0
按l.link\U id、ac.admin\U类分组
我对PostgreSql了解不多,但t-SQL就是这样做的:
select l.link_id, ac.admin_class, min(ac.priority)
from base.links as l
inner join base.admin_classes as ac
on ac.code=l.code
and ac.admin_class<>0
group by l.link_id, ac.admin_class
选择l.link\u id,ac.admin\u class,min(ac.priority)
从base.links到l
内部连接base.admin_类作为ac
在ac.code=l.code上
按l.link\U id、ac.admin\U类分组
具有ac.admin_类0
我认为你应该做两件事
首先创建名为viewAdminRoads的视图
select l.link_id, ac.admin_class, min(ac.priority)
from base.links as l
inner join base.admin_classes as ac
on ac.code=l.code
group by l.link_id, ac.admin_class
having ac.admin_class <> 0
创建此视图简化了整个过程
第二次创建您的选择
CREATE VIEW viewAdminRoads
AS
SELECT
roads.code,
roads.road,
admin_classes.admin_class,
admin_classes.priority
FROM roads
INNER JOIN admin_classes
ON roads.road
= admin_classes.road
WHERE admin_classes.priority <> 0
请记住,视图是您的朋友。我认为只有当您将“having”子句与聚合本身结合使用时,“having”子句才是真正必要的。将其更改为“where”并将行移到“groupby”上方也会起作用:-)我错了(对于一个链接id,我有几个来自admin_类的RAW,所以您的请求返回如下smth:1-2-2、1-3-2和etc。但是我只需要一行链接id和两列,因为我在insert子句中使用了它,我试图简化并编写了不正确的代码。)我们有下面的表1:链接id,代码。表2:id、代码、道路。表3:道路、管理等级、优先级。因此,我们有多条路用于一个link_id,表3中的几行用于一个link_id,但我们希望得到link_id+admin_类,具有最小优先级)谢谢回答),但我只需要结果集中的两列,因为我在imsert clouse中使用它((最后一个语句将返回一个链接的1-2-2,1-3-2,1-4-2,但我同意一个链接只需要一行,但我们的项目政治不接受观点。但我已经使用sub-select解决了我的问题。谢谢你的回答。)
CREATE VIEW viewAdminRoads
AS
SELECT
roads.code,
roads.road,
admin_classes.admin_class,
admin_classes.priority
FROM roads
INNER JOIN admin_classes
ON roads.road
= admin_classes.road
WHERE admin_classes.priority <> 0
SELECT
link.link_id,
MIN(viewAdminRoads.priority) as priority
FROM links
INNER JOIN viewAdminRoads
ON links.code
= viewAdminRoads.code
GROUP BY link.link_id