紧急!求一个SQL查询~!

liuqinglq 2003-12-29 11:58:41
如题。两个表

表一:

Code char(6)
Name varchar(50)
Checked bit

分别指书号(唯一),书名,是否核查

表二:(与表一是1:n关系)

Code char(6)
MTimes char(2)
Checked bit

分别指书号,改版次数,是否核查(其中书号必须是在表一中存在的,书号和改版次数合起来做为主键)

现在要求得如下一个记录集(Rs):

每条记录包括所有表一中被核查过或者表二中被核查过的记录,该记录有4个字段,包括Code,Name,MTimes,Checked。对于表一中记录的MTimes用一个默认值来代替(比如'00'),表二中记录的Name用表一中的对应Code的Name值。最后要求所有记录都要按Code排序。

想了半天也不知道该用什么样的SQL语句才成……请高手帮忙!!谢谢~
...全文
73 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
liuqinglq 2004-01-02
  • 打赏
  • 举报
回复
多谢 dio833() 和 chineseProgram(程序王)

想来真是惭愧:

发现自己用 SQL 语句还是严重不足,居然没有想到用 join 的结果做子查询

而且也不知道怎么样给字段设置默认值……

看来光看 SQL 手册还是不行的……

一定要向前辈们好好学习,顺便问一下,哪里有比较好的SQL的教程下载?要那种主要讲解实际例子而不是要分析语法的……

总之,多谢各位,就此结帖
chineseProgram 2004-01-01
  • 打赏
  • 举报
回复
SELECT code, name, '00' AS Mtimes, checked
FROM tb1
WHERE checked = 1
UNION
SELECT tb2.code, name, tb2.Mtimes, tb2.checked
FROM tb2
WHERE tb2.checked = 1
ORDER BY code, mtimes
chineseProgram 2004-01-01
  • 打赏
  • 举报
回复
dio833() 的做法是对的!~!!!!!!!同意他的观点~~~~!
chineseProgram 2004-01-01
  • 打赏
  • 举报
回复
up
dio833 2004-01-01
  • 打赏
  • 举报
回复
join + union ^^
不知道此论坛支不支援繁体中文呢?
我输入简体中文不甚方便


SELECT code, name, '00' AS Mtimes, checked
FROM tb1
WHERE checked = 1
UNION
SELECT tb2.code, name, tb2.Mtimes, tb2.checked
FROM tb2 LEFT JOIN
tb1 ON tb1.code = tb2.code
WHERE tb2.checked = 1
ORDER BY code, mtimes
liuqinglq 2003-12-30
  • 打赏
  • 举报
回复
对了,不是“书号”或者“改版次数”的核查

是指这一次工作(出新书或者把旧书改版)是否核查
liuqinglq 2003-12-30
  • 打赏
  • 举报
回复
表一 是书籍的原始数据啊(可以说是第0次改版)

呵呵~

表二 则是第1-n次改版了

不管是第0次还是第n次,都需要核查,都有一个字段标记。就是这样了
huang59 2003-12-30
  • 打赏
  • 举报
回复
Checked bit 为什么两个表都放呀?一个是书号核查了没有,一个是改版次数核查了没有?
liuqinglq 2003-12-30
  • 打赏
  • 举报
回复
怎么没人来看啊……

高手们来帮帮忙啊!

liuqinglq 2003-12-30
  • 打赏
  • 举报
回复
对了,还有一点要求忘记说了

关于最后结果的排序,不但要按Code排序,而且对于Code相同的要按MTimes排序……



liuqinglq 2003-12-30
  • 打赏
  • 举报
回复
承上

回:azh9703()

join语句的语法我稍微明白一点,但是不管是left,right还是inner(返回记录数最少的就是这个),都有一个共同点,如果符合On条件的表一中记录和表二中记录均存在,那么仅返回一条记录(left是不管表二中是否存在符合On条件的记录,right是不管表一中是否存在符合On条件的记录),而我的要求是要返回两条记录!

看前面我举的例子,对于 Code=AA0001 的记录如果用join语句(不管left/right),则返回两条记录,而不会出现我给出结果中的第一条记录。

你可以用 Select a.Code,a.Name,b.MTimes From a Left Join b On a.Code=b.Code And (a.Checked=1 Or b.Checked=1) 去试试看就明白了!

简单的说,join语句是横向连接,而我要求的结果不但有横向连接,还有纵向联合(而且要排序)。

也就是说,单独用join或者union都是不行的……
liuqinglq 2003-12-30
  • 打赏
  • 举报
回复
回:capcom(大浪淘沙)

我的表应该没有问题。

我的意思是,查询求得的结果应该包含表一和表二中所有checked=1的记录,不是仅“a.checked=1”,是“a.checked=1 or b.checked=1”

举个例子吧:

表一

Code Name Checked
AA0001 book1 1
AA0003 book2 1
AA0017 book3 0

表二

Code MTimes Checked
AA0001 01 1
AA0001 02 1
AA0001 03 0
AA0017 01 1
AA0017 02 0

查询得到的结果应该是:

Code Name MTimes Checked
AA0001 book1 00 1
AA0001 book1 01 1
AA0001 book1 02 1
AA0003 book2 00 1
AA0017 book3 01 1

一共5条记录。用你的SQL语句显然不对……
onebody 2003-12-30
  • 打赏
  • 举报
回复
up
azh9703 2003-12-30
  • 打赏
  • 举报
回复
楼主看看left join 和inner join和right join语法就知道了

capcom 2003-12-30
  • 打赏
  • 举报
回复
哦,少了个FROM!粗心!
capcom 2003-12-30
  • 打赏
  • 举报
回复
说仔细点!你的表好象有问题,看不懂你的题目!猜测你的意图编写代码如下:
表1:a 表2:b
select a.code ,a.name,b.mtime,checked a left join b on a.checked=1 and a.code=b.code

CHECKED这列好象没什么用???????

28,406

社区成员

发帖
与我相关
我的任务
社区描述
ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
社区管理员
  • ASP
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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