[postgresql]高分求一个sql

jackingod 2009-01-09 08:34:04
问题如下:
表A
CREATE TABLE student_new
(
pkey1 int4 NOT NULL,
pkey2 varchar(20) NOT NULL,
attend_year int4,
attend_grade int4,
attend_class text,
attend_no int4,
former_year int4,
former_grade int4,
former_class text,
former_no int4,
CONSTRAINT student_new_pkey PRIMARY KEY (pkey1, pkey2)
)

例: 表A1:pkey1 pkey2 attend_year attend_grade attend_class attend_no attend_year attend_grade attend_class attend_no
1 BMW 2008 3 班级3 3 2007 2 班级2 2

要求查询结果如下:
pkey1 pkey2 year grade class no
1 BMW 2008 3 班级3 3
1 BMW 2007 2 班级2 2
谢谢!
...全文
68 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
jackingod 2009-01-09
  • 打赏
  • 举报
回复
以后还请多关照!@_@
jackingod 2009-01-09
  • 打赏
  • 举报
回复
嗯,ok,谢了。
马上结贴!
wwwwb 2009-01-09
  • 打赏
  • 举报
回复
是POSTGRESQL的,可能有问题,自己查查语法
jackingod 2009-01-09
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 wwwwb 的回复:]
是UPDATE?
UPDATE B SET (pkey1,pkey2,attend_year,attend_grade,attend_class,attend_no)=
(A.pkey1,A.pkey2,A.attend_year,A.attend_grade,A.attend_class,A.attend_no)
FROM A WHERE A.pkey1=B.pkey1

postgresql不是很熟悉,可以查查postgresql的UPDATE语法
[/Quote]
老兄,那你写的是支持什么的啦?oracle?sql server?还是纯sql的都支持?
wwwwb 2009-01-09
  • 打赏
  • 举报
回复
呵呵,mysql不支持
jackingod 2009-01-09
  • 打赏
  • 举报
回复
谢谢,问题解决了心情爽啦!
jackingod 2009-01-09
  • 打赏
  • 举报
回复
哦,这个好像oracle是可以的,我以前也写过;这个是不是也适用MySql?
我做了一个成功了:
update B set attend_year=A1.attend_year, attend_grade=A1.attend_grade,
attend_class=A1.attend_class,attend_no=A1.attend_no
from (select pkey1, pkey2,attend_year,attend_grade,attend_class,attend_no
from A where pkey1=1
union
select pkey1, pkey2,former_year,former_grade,former_class,former_no
from A
where pkey1=1 ) as A1
where A1.pkey1 = grade_tbl.sch_id and A1.pkey2 = B.pkey2
and A1.pkey2 in (select pkey2 from B where pkey1 = 1)
我再试试
[Quote=引用 13 楼 wwwwb 的回复:]
是UPDATE?
UPDATE B SET (pkey1,pkey2,attend_year,attend_grade,attend_class,attend_no)=
(A.pkey1,A.pkey2,A.attend_year,A.attend_grade,A.attend_class,A.attend_no)
FROM A WHERE A.pkey1=B.pkey1

postgresql不是很熟悉,可以查查postgresql的UPDATE语法
[/Quote]
wwwwb 2009-01-09
  • 打赏
  • 举报
回复
是UPDATE?
UPDATE B SET (pkey1,pkey2,attend_year,attend_grade,attend_class,attend_no)=
(A.pkey1,A.pkey2,A.attend_year,A.attend_grade,A.attend_class,A.attend_no)
FROM A WHERE A.pkey1=B.pkey1

postgresql不是很熟悉,可以查查postgresql的UPDATE语法
jackingod 2009-01-09
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 wwwwb 的回复:]
如果两表有相同的KEY字段,可以,贴记录及要求结果出来看看
示例:
select * from a left join b on a.id=b.id
[/Quote]
这个是关于更新的问题吗?

例如下:
表A
CREATE TABLE student_new
(
pkey1 int4 NOT NULL,
pkey2 varchar(20) NOT NULL,
attend_year int4,
attend_grade int4,
attend_class text,
attend_no int4
CONSTRAINT student_new_pkey PRIMARY KEY (pkey1, pkey2)
)

表B
CREATE TABLE grade_tbl
(
pkey1 int4 NOT NULL,
pkey2 text NOT NULL,
attend_year int4 NOT NULL,
attend_grade int4 NOT NULL,
attend_class text NOT NULL,
attend_no int4 NOT NULL,
CONSTRAINT table1_pkey PRIMARY KEY (pkey1,pkey2 , attend_year)
)
例: 表A: pkey1 pkey2 attend_year attend_grade attend_class attend_no
1 BMW 2008 3 班级3 3
把A表的这个记录更新到表B
谢谢!
ACMAIN_CHM 2009-01-09
  • 打赏
  • 举报
回复
自连接只有一条记录,所有必须用UNION来生成多条记录。
wwwwb 2009-01-09
  • 打赏
  • 举报
回复
如果两表有相同的KEY字段,可以,贴记录及要求结果出来看看
示例:
select * from a left join b on a.id=b.id
jackingod 2009-01-09
  • 打赏
  • 举报
回复
随便还想问您(wwwwb)一个问题,就是postgresql中关于从一个表(A)检索数据更新另外一个表(B)中的多列,要怎么写?
能不能给一个例子?一定要是多列啦,谢谢了。
wwwwb 2009-01-09
  • 打赏
  • 举报
回复
呵呵,问题解决了吗?
jackingod 2009-01-09
  • 打赏
  • 举报
回复
嗯,想了想是要用union,谢谢楼主了
wwwwb 2009-01-09
  • 打赏
  • 举报
回复
NO,用UNION解决,因为你用从一行生成两行记录
jackingod 2009-01-09
  • 打赏
  • 举报
回复
我想是不是用自连接可以搞定?但是postgresql我确实才用不久,也没怎么学过。谢谢^@^
jackingod 2009-01-09
  • 打赏
  • 举报
回复
谢谢wwwwb的即时回复,但是好像没有看清楚我的表结构和我的例子。首先那个attend_year不是固定的也不是一个条件,而且我要的结果其实是一条记录拆分成两条;
通过表结构可以看出:attend_year, attend_grade, attend_class, attend_no和former_year,former_grade,former_class,former_no 其实类型对应是一样的,我要的其实就是主键一样的情况下,一条记录拆分成两条记录的一个检索结果,不知道您明白了我的意思没有?
wwwwb 2009-01-09
  • 打赏
  • 举报
回复
TRY:
SELECT pkey1,pkey2,attend_year,attend_grade,attend_class,attend_no
FROM TT WHERE attend_year='2008'
UNION
SELECT pkey1,pkey2,former_year,former_grade,former_class,former_no
FROM TT WHERE attend_year='2007'
order by pkey1,pkey2,attend_year,attend_grade
jackingod 2009-01-09
  • 打赏
  • 举报
回复
不好意思,例子里面没写好,让您误解了,正确的例子如下:
例: 表A1:pkey1 pkey2 attend_year attend_grade attend_class attend_no former_year former_grade former_class former_no
1 BMW 2008 3 班级3 3 2007 2 班级2 2
要求查询结果如下:
pkey1 pkey2 year grade class no
1 BMW 2008 3 班级3 3
1 BMW 2007 2 班级2 2
wwwwb 2009-01-09
  • 打赏
  • 举报
回复
记录不是很清楚,是两条记录还是一条?
TRY:
SELECT pkey1,pkey2,attend_year,attend_grade,attend_class,attend_no
FROM TT WHERE attend_year='2008'
UNION
SELECT pkey1,pkey2,attend_year,attend_grade,attend_class,attend_no
FROM TT WHERE attend_year='2007'

56,675

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧