注册 登录
编程论坛 PowerBuilder

PB的data window的SQL问题, 如何才可以选择一个栏位两次?

yihuizeng 发布于 2007-03-22 19:13, 4333 次点击
SELECT LCAAPRC.CLMNUM,
LCAAPRC.SUBMITDTE,
LCAAPRC.SURNAME,
LCAAPRC.ASSESSOR,
(select LCALPF.PNDATE from LCALPF where
LCALPF.PNCODE like 'I%'),
(select LCALPF.PNDATE from LCALPF where
LCALPF.PNCODE like 'Q%'),
(select LCALPF.reslvdte from LCALPF where
LCALPF.reslvcde <> '')
FROM LCAAPRC,LCALPF

从这个SQL里面大家可以看到我一共提取了LCALPF.PNDATE这条数据两次, 不过是根据两条不同的where条件语句. 我的目的是提取PNDATE这个字段分别在LCALPF.PNCODE的开头字母是I 和 Q的时候, 如果按照我现在的SQL会出现我提取了多余一条数据的警告, 导致数据提取失败, 请问各位高人, 要如何才可以做得到呢??

谢谢
22 回复
#2
路過2007-03-23 09:31
回复:(yihuizeng)PB的data window的SQL问题, 如何才...
SELECT A.SEQ,B.SEQ
FROM (SELECT TOPIC,SEQ FROM HELP WHERE SEQ LIKE '1%') A,
(SELECT TOPIC,SEQ FROM HELP WHERE SEQ LIKE '2%') B
WHERE A.TOPIC = B.TOPIC ;
顯示兩個欄位。topic是主健。
你那裡都沒有where條件
        
#3
yihuizeng2007-03-23 10:15
有一个问题, 我试过照你的sql来改我的语句, 不过

FROM (SELECT TOPIC,SEQ FROM HELP WHERE SEQ LIKE '1%') A,
(SELECT TOPIC,SEQ FROM HELP WHERE SEQ LIKE '2%') B
WHERE A.TOPIC = B.TOPIC ;

这一段, 在我的语句中, 例如, 我只需要选择SEQ而不需要选择Topic的, 所以我把他改变成: FROM (SELECT SEQ FROM HELP WHERE SEQ LIKE '1%') A,
(SELECT SEQ FROM HELP WHERE SEQ LIKE '2%') B
WHERE A.TOPIC = B.TOPIC ;
这样子就会显示说 topic not in table A in *N.
请问这样的情况要怎么解决? 谢谢

#4
路過2007-03-23 14:02
裡面的TOPIC就是關聯用的呀當然是要的
(SELECT SEQ FROM HELP WHERE SEQ LIKE '2%') B
把TOPIC加進去就好啦,
打個比方:
我不知道LCAAPRC,LCALPF之間的關系,我現在假設欄位SUBMITDTE是兩個表的主健,以這個欄位相聯
就可以這個寫:

SELECT LCAAPRC.CLMNUM,
LCAAPRC.SUBMITDTE,
LCAAPRC.SURNAME,
LCAAPRC.ASSESSOR,
A.PNDATE,
B.PNDATE,
LCALPF.reslvdte
FROM LCAAPRC,LCALPF,
    (select SUBMITDTE,PNDATE from LCALPF where
LCALPF.PNCODE like 'I%') A,
    (select SUBMITDTE,PNDATE from LCALPF where
LCALPF.PNCODE like 'Q%') B
WHERE LCAAPRC.SUBMITDTE = A.SUBMITDTE AND
LCAAPRC.SUBMITDTE = B.SUBMITDTE AND
LCAAPRC.SUBMITDTE = LCALPF.SUBMITDTE AND
LCALPF.reslvcde <> ''


#5
yihuizeng2007-03-23 14:17
LCALPF里面有三个主键, 分别是CLMNUM, CHDRNUM, PNCODE, 那需要把这三个都加进去吗? 那这个SQL语句不是变得非常庞大了吗?? 谢谢
#6
notbig2007-03-23 14:56

楼主写法不正确
因为你SELECT每条记录却单个字段却是个多记录的集合
我不清楚楼主想要取什么数据。

#7
yihuizeng2007-03-23 15:10
不好意思,可能写得太混乱了吧, 我再说明一下, 我是想从LCALPF中提取一个叫PNDATE(照会日期)的字段. 不过我想通过两种不同的过滤条件来提取, 一个是当PNCODE(照会代码)的开头第一个字母是等于I时提取的PNDATE. 另外一个是当PNCODE(照会代码)的开头第一个字母是等于Q时提取的PNDATE. LCALPF这个table一共有三个primary key, 分别是, chdrnum, clmnum和pncode, 按照这个思路的sql应该怎么写呢? 谢谢
#8
路過2007-03-23 17:39

你可以按照上面的方法自已試一下嗎?看一下數據拉出是不是對的。

#9
yihuizeng2007-03-23 22:50
我是想按照来做, 不过照你的方法, LCALPF里面有三个主键呢, 我需要除了PNDATE其他三个主键都全部要选择的话, 我的SQL语句会变得非常大, 这样提取数据的速度会降低而且我怕PB也跑不起太复杂的语句

谢谢
#10
notbig2007-03-24 22:46
select pndate from table where pncode like 'i%' or pncode like 'q%'
#11
yihuizeng2007-03-25 23:54
我觉得斑竹可能有点误会, 我再次澄清一下。 首先我需要两个栏位: 会签日期和调查日期。 这两个栏位是都需要在data window上显示出来的。 分别是两个不同的栏位来的。会签是选择PNDATE当pncode是开头是i的数据,调查是选择PNDATE当pncode是开头是q的数据。 按照您的做法, 似乎只是一个拦位按照不同的条件选择不同的数据, 也就是一个pndate栏位,他可以有pncode like %i 或者 pncode like q%两条过滤条件. 这跟我的要求有些不同吧
#12
notbig2007-03-26 08:45

你是一个表还是两个表
你可以列出主要表的主要字段及相关数据,达到目的的数据显示参考。

#13
yihuizeng2007-03-27 10:12
好的好的, 这个表其实是提取不同类型照会的日期的表格. 是一个表里面有这四个栏位,分别是:


号码(num) 签核日期(qdate) 调查日期(cdate) 核销日期(sdate)

qdate其实是后台 'LCALPF' 表中里的pndate(照会日期)在pncode(照会码)等于I****的时候, 这样的照会被定义成送签核照会, 所以这个时候的pndate(照会日期)就是被定义为签核日期了

cdate则是后台里的'LCALPF'表中的pndate(照会日期)在pncode(照会码)等于Q****的时候,这样的照会就被定义为调查照会,所以这个时候的pndate(照会日期)就被定义为签核日期了

sdate则是后台里的'LCALPF'表中的reslvdte(解决日期)在reslvcode(解决码)不为空值的时候, 这样代表这条照会已经有了解决方法了, 这时候reslvdte就可以并定义为核销日期了.

他们都是在同一个表LCALPF中提取的, 麻烦的是qdate和cdate, select的都是pndate.我不知道怎么做才行??


#14
notbig2007-03-27 13:34

那么LCALPF表的结构呢?

#15
notbig2007-03-27 13:36
假设一个NUM记录它在LCALPF表中的记录是什么样?
它在LCALPF表中是不是一条记录还是多条记录
这些都没有交待的?
#16
notbig2007-03-27 13:38

再问一下,如果一条NUM在LCALPF表中是多条记录,那么是不是当PCODE为I字头时的记录只有一条还是多条,如果是多条应该取哪条,同样的就是当为Q字头时又是如何

#17
yihuizeng2007-03-27 17:39

您的意思是以上那些字段在LCALPF的数据结构吗? 

pncode: char(5), 例子Q20035或者 I1000
num: char(9),    例子:700000769
pndate: decimal(0), 例子:20070206
reslvcode: char(5) 例子:R2111
reslvdte: decimal(0), 例子:20070312

请问这些资料是不是你需要的?

#18
notbig2007-03-28 08:26
这些是需要的,还有就是70000769 在PNCODE的字头为Q时是只会有一条记录还是会有多条
如按上表记录会不会是这样
q20035 70000769 20070206 R2111 20070312
i1000 70000769 20070306 R2111 20070312

还是70000769 只会有一条记录,只是PNCODE的值可能是Q字头也可能是I字头

#19
notbig2007-03-28 08:27
楼主可以罗列一些数据出来
#20
yihuizeng2007-03-28 16:39
以下是引用notbig在2007-3-28 8:26:38的发言:
这些是需要的,还有就是70000769 在PNCODE的字头为Q时是只会有一条记录还是会有多条
如按上表记录会不会是这样
q20035 70000769 20070206 R2111 20070312
i1000 70000769 20070306 R2111 20070312

还是70000769 只会有一条记录,只是PNCODE的值可能是Q字头也可能是I字头



其实我说漏了点东西, 需要查找的分别是‘最小送签核照会日期’和‘最小调查照会日期’
也就是照会码(pncode)开头为Q或者I所相对应的最小的照会日期(pndate)
以及最大解决日期(rslvdate)

用7000769去查询pncode开头为Q后者I的PNDATE的时候会出现多条记录,因为对应这个号码可能
出现多条照会, 同样每条照会都需要一个解决码才确定这条照会已经解决, 如果解决码是空则
代表并无解决。解决码,解决日期并不影响会签和调查日期


例如会出现以下的情况

PNCODE NUM PNDATE Rslvcode Rslvdate

q200035 70000769 20060203 T10000 20071120
q100000 70000769 20070103 T20000 20050303
i501230 70000769 20070505
i102123 70000769 20070101 T51431 20060805
q938100 70000769 20051022 T32123 20080909

从这个照会提取出来的数据可以看得到, 用70000769可以查出三条Q开头的pncode和两条I开头的pncode
他们分别对应的是不同的日期, 而rslvcode和rslvdate就只有一条
意思是在日期20060203 这个号码70000769有一条送签核的照会
在日期20060103 这个号码70000769有一条送签核的照会
在日期20051022 这个号码70000769有一条送签核的照会

在日期20070103 这个号码70000769有一条调查的照会
在日期20070101 这个号码70000769有一条调查的照会

q200035这条签核照会在20071120这个时间以T10000的解决方式解决了
q100000这条签核照会在20050303这个时间以T20000的解决方式解决了
q938100这条签核照会在20080909这个时间以T32123的解决方式解决了
i501230这条调查照会并没有响应的解决码,解决日期也为空,代表为解决(当解决码为空值,解决日期必然也为空)
i102123这条调查照会在20060805这个时间以T51431的解决方式解决了

我的SQL的目的是可以分别提取出三个栏位:最小的签核照会日期, 最小的调查照会日期和最大解决日期
也就是带出
QHDATE DCDATE JJDATE
20050303(最小签核日期), 200060805(最小调查日期)和 20080808(最大解决日期)

#21
notbig2007-03-28 23:06
这样就清楚了
下次问问题的时候要描述清楚,不然浪费时间
不过你上面的开始讲述与最后示例结果是不一致的,结果中都没有取PNDATE这个字段值,我暂用你开头描述的讲法写

[此贴子已经被作者于2007-3-28 23:18:14编辑过]

#22
notbig2007-03-28 23:11

select a.CLMNUM,
a.SUBMITDTE,
a.SURNAME,
a.ASSESSOR,
(select min(b.pndate) from lcalpf b
where b.clmnum = a.clmnum and
substring(b.pcode,1,1) ='q') as qhdate,
(select min(c.pndate) from lcalpf c
where c.clmnum = a.clmnum and
substring(c.pcode,1,1) ='i') as dcdate,
(select max(d.rslvdate) from lcalpf d
where d.clmnum = a.clmnum and
d.rslvcode<>null) as jjdate,

from clmnum a
具体的表名字段名请自行检查。


[此贴子已经被作者于2007-3-28 23:22:06编辑过]

#23
ycxu20182009-07-31 17:49
頂 notbig的“select pndate from table where pncode like 'i%' or pncode like 'q%'; ”,如果還需要其他的列信息,可以放在前面。說了半天主碼,好像這裏和主碼沒有什麽關係吧。
1