SQL使用WITH关键字创建视图语句

时间:2014-10-05 20:42:58

标签: sql view psql create-view

我在SQL中编写此Create视图语句时遇到问题。我想从一张桌子上获取人员ID,名字和姓氏,前往科罗拉多大学(uid = 2)。然后我想使用WITH子句将此表与我的body_composition表结合起来,并打印出body_composition表中的所有内容。以下是我正在进行的查询的确切定义。

  

首先,编写一个返回人名(pid),名字的查询   来自所有人的(fname)和姓氏(lname)   那些去科罗拉多大学的人。然后,将该查询放入   一个WITH子句并将其用作要组合的公用表表达式(CTE)   通过内部联接得到的身体组成表的结果   参加大学的人的身体成分   科罗拉多。

我尝试运行我的创建视图语句我收到此错误

  

错误:语法错误在或附近"什么"第7行:WITH   what.body_composition为c

这是我的创建视图语句的代码以及我正在使用的表。

CREATE VIEW withclause AS
SELECT a.pid, a.fname, a.lname
FROM what.person AS a
INNER JOIN what.university AS b
on a.uid = b.uid
WHERE uid = 2
WITH what.body_composition AS c
SELECT *
FROM what.body_composition;

以下是我正在使用的三个表

                  Table "what.university"
 Column          |         Type          |                        Modifiers                        
-----------------+-----------------------+--------------------------------------
 uid             | integer               | not null default nextval('university_uid_seq'::regclass)
 university_name | character varying(50) | 
 city            | character varying(50) | 


 Table "what.body_composition"
 Column |  Type   | Modifiers 
--------+---------+-----------
 pid    | integer | not null
 height | integer | not null
 weight | integer | not null
 age    | integer | not null


    Table "what.person"
 Column |         Type          |                      Modifiers                      
--------+-----------------------+-----------------------------------------------
 pid    | integer               | not null default nextval('person_pid_seq'::reg class)
 uid    | integer               | 
 fname  | character varying(25) | not null
 lname  | character varying(25) | not null

1 个答案:

答案 0 :(得分:2)

根据问题描述,我很确定这就是你想要的:

CREATE VIEW withclause AS

WITH cte AS (
  SELECT p.pid, p.fname, p.lname
  FROM what.person as p
  INNER JOIN what.university as u
  ON p.uid = u.uid
  WHERE p.uid = 2
)

SELECT cte.pid, cte.fname, cte.lname, c.age, c.height, c.weight
FROM cte
INNER JOIN what.body_composition c on c.pid = cte.pid;

Sample SQL Fiddle(基于Postgres,我假设您正在使用基于psql标记)。