Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL:如何在内部选择上添加条件_Sql_Select - Fatal编程技术网

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

因此,对于一个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.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