left join 替换成+,如何写

theoffspring 2011-11-23 12:57:18
  SELECT 
FI.SVCID,
FI.GROUPNO,
FI.ENQUETE_NO,
QL.QUESTION_NO,
QL.QUESTION,
QL.QTYPE,
CL.CHOICENO,
CL.CHOICETXT,
FI.STARTDT,
FI.ENDDT
FROM
INFO FI
LEFT OUTER JOIN QUESTION_LIST QL
ON FI.ENQUETE_NO = QL.ENQUETE_NO
LEFT OUTER JOIN CHOICE_LIST CL
ON FI.ENQUETE_NO = CL.ENQUETE_NO
AND QL.QUESTION_NO = CL.QUESTION_NO
WHERE
FI.SVCID = 'XXX'
AND
FI.GROUPNO = 53
AND
FI.STARTDT < SYSDATE
AND
FI.ENDDT > SYSDATE

把left join的写法换成+的写法,如何弄?
...全文
285 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
theoffspring 2011-11-25
  • 打赏
  • 举报
回复
解决了,FI表和QL是一对多的关系,QL和CL又是一对多的关系,QL表代表问题,CL代表每个问题的选项,而FI则代表一堆问题。所以根据业务关系,调整了关联字段,没有用子查询解决了。这样做:
AND FI.ENQUETENO = QL.ENQUETENO(+)
AND QL.ENQUETENO = CL.ENQUETENO(+)
AND QL.QUESTIONNO = CL.QUESTIONNO

让QL做主表来左关联FI和CL,查询结果一样。
cosio 2011-11-23
  • 打赏
  • 举报
回复
第一步
select * from a,b where a.id=b.id(+)
OK
第二步
select * from a,b,c where a.id=b.id(+) and a.id=c.id(+)
theoffspring 2011-11-23
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 lxpbs8851 的回复:]
SQL code

select FICL.SVCID, FICL.GROUPNO, FICL.ENQUETE_NO, FICL.STARTDT, FICL.ENDDT , FICL.CHOICENO, FICL.CHOICETXT,FICL.QUESTION_NO, QL.QUESTION_NO, QL.QUESTION, QL.QTYPE
from
(
SELECT FI.SVCI……
[/Quote]
子查询的办法是可行的,不过如果这么费事,也没有必要用+了
theoffspring 2011-11-23
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 cosio 的回复:]
那可以这样子,先两个表先链接,两个表OK,在测试一下和第三个表来链接,一个个,测试!
[/Quote]
没太明白你意思。
oO寒枫Oo 2011-11-23
  • 打赏
  • 举报
回复

select FICL.SVCID, FICL.GROUPNO, FICL.ENQUETE_NO, FICL.STARTDT, FICL.ENDDT , FICL.CHOICENO, FICL.CHOICETXT,FICL.QUESTION_NO, QL.QUESTION_NO, QL.QUESTION, QL.QTYPE
from
(
SELECT FI.SVCID, FI.GROUPNO, FI.ENQUETE_NO, FI.STARTDT, FI.ENDDT , CL.CHOICENO, CL.CHOICETXT,CL.QUESTION_NO
from INFO FI ,CHOICE_LIST CL
where FI.ENQUETE_NO = CL.ENQUETE_NO(+) and FI.SVCID = 'XXX' AND FI.GROUPNO = 53 AND FI.STARTDT < SYSDATE AND FI.ENDDT > SYSDATE ) FICL,
QUESTION_LIST QL
where FICL.ENQUETE_NO= QL.ENQUETE_NO(+) and FICL.QUESTION_NO=QL.QUESTION_NO(+)
oO寒枫Oo 2011-11-23
  • 打赏
  • 举报
回复

select FICL.SVCID, FICL.GROUPNO, FICL.ENQUETE_NO, FICL.STARTDT, FICL.ENDDT , FICL.CHOICENO, FICL.CHOICETXT,FICL.QUESTION_NO
from
(
SELECT FI.SVCID, FI.GROUPNO, FI.ENQUETE_NO, FI.STARTDT, FI.ENDDT , CL.CHOICENO, CL.CHOICETXT,CL.QUESTION_NO
from INFO FI ,CHOICE_LIST CL
where FI.ENQUETE_NO = CL.ENQUETE_NO(+) and FI.SVCID = 'XXX' AND FI.GROUPNO = 53 AND FI.STARTDT < SYSDATE AND FI.ENDDT > SYSDATE ) FICL,
QUESTION_LIST QL
where FICL.ENQUETE_NO= QL.ENQUETE_NO(+) and FICL.QUESTION_NO=QL.QUESTION_NO(+)
cosio 2011-11-23
  • 打赏
  • 举报
回复
那可以这样子,先两个表先链接,两个表OK,在测试一下和第三个表来链接,一个个,测试!
Alessandro_ 2011-11-23
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 cosio 的回复:]

SQL code
SELECT
FI.SVCID,
FI.GROUPNO,
FI.ENQUETE_NO,
QL.QUESTION_NO,
QL.QUESTION,
QL.QTYPE,
CL.CHOICENO,
CL.CHOICETXT,
FI.STARTDT,
……
[/Quote]++
oO寒枫Oo 2011-11-23
  • 打赏
  • 举报
回复

SELECT FI.SVCID, FI.GROUPNO, FI.ENQUETE_NO, QL.QUESTION_NO, QL.QUESTION, QL.QTYPE, CL.CHOICENO, CL.CHOICETXT, FI.STARTDT, FI.ENDDT
FROM INFO FI , QUESTION_LIST QL ,CHOICE_LIST CL
WHERE FI.ENQUETE_NO *= QL.ENQUETE_NO AND FI.ENQUETE_NO *= CL.ENQUETE_NO AND CL.QUESTION_NO *=QL.QUESTION_NO
FI.SVCID = 'XXX' AND FI.GROUPNO = 53 AND FI.STARTDT < SYSDATE AND FI.ENDDT > SYSDATE


SELECT FI.SVCID, FI.GROUPNO, FI.ENQUETE_NO, QL.QUESTION_NO, QL.QUESTION, QL.QTYPE, CL.CHOICENO, CL.CHOICETXT, FI.STARTDT, FI.ENDDT
FROM INFO FI , QUESTION_LIST QL ,CHOICE_LIST CL
WHERE FI.ENQUETE_NO = QL.ENQUETE_NO(+) AND FI.ENQUETE_NO = CL.ENQUETE_NO(+) AND CL.QUESTION_NO=QL.QUESTION_NO(+)
FI.SVCID = 'XXX' AND FI.GROUPNO = 53 AND FI.STARTDT < SYSDATE AND FI.ENDDT > SYSDATE

theoffspring 2011-11-23
  • 打赏
  • 举报
回复
是主要的是,组长就在旁边不远,实在不方便,呵呵。
theoffspring 2011-11-23
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 cosio 的回复:]
你QQ号多少,我加你Q,远程连接过去,帮你看一下!
[/Quote]
感谢你的热心,不过公司不允许上qq
cosio 2011-11-23
  • 打赏
  • 举报
回复
你QQ号多少,我加你Q,远程连接过去,帮你看一下!
theoffspring 2011-11-23
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 cosio 的回复:]
SQL code
SELECT
FI.SVCID,
FI.GROUPNO,
FI.ENQUETE_NO,
QL.QUESTION_NO,
QL.QUESTION,
QL.QTYPE,
CL.CHOICENO,
CL.CHOICETXT,
FI.START……
[/Quote]
不行啊,还是ORA-01417: a table may be outer joined to at most one other table
cosio 2011-11-23
  • 打赏
  • 举报
回复
SELECT 
FI.SVCID,
FI.GROUPNO,
FI.ENQUETE_NO,
QL.QUESTION_NO,
QL.QUESTION,
QL.QTYPE,
CL.CHOICENO,
CL.CHOICETXT,
FI.STARTDT,
FI.ENDDT
FROM
INFO FI
,QUESTION_LIST QL
,CHOICE_LIST CL
WHERE
FI.ENQUETE_NO = QL.ENQUETE_NO(+)
AND
FI.ENQUETE_NO = CL.ENQUETE_NO(+)
AND
CL.QUESTION_NO = QL.QUESTION_NO(+)
AND
FI.SVCID = 'XXX'
AND
FI.GROUPNO = 53
AND
FI.STARTDT < SYSDATE
AND
FI.ENDDT > SYSDATE


改了一下,你试试!
theoffspring 2011-11-23
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 cosio 的回复:]
引用 5 楼 theoffspring 的回复:
引用 3 楼 cosio 的回复:
SQL code
SELECT
FI.SVCID,
FI.GROUPNO,
FI.ENQUETE_NO,
QL.QUESTION_NO,
QL.QUESTION,
QL.QTYPE,
CL.CHOICENO,
CL.CHOICETXT,
FI.START……

实际上我一开始就是这么写……
[/Quote]
还是报一样的错,而且这么写,不是把QL当成主表了吗,实际应该FI是主表。
cosio 2011-11-23
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 theoffspring 的回复:]
引用 3 楼 cosio 的回复:
SQL code
SELECT
FI.SVCID,
FI.GROUPNO,
FI.ENQUETE_NO,
QL.QUESTION_NO,
QL.QUESTION,
QL.QTYPE,
CL.CHOICENO,
CL.CHOICETXT,
FI.START……

实际上我一开始就是这么写的,但报错:ORA-01417: a table m……
[/Quote]

--说明表的链接顺序有问题

FI.ENQUETE_NO (+) = QL.ENQUETE_NO
AND
FI.ENQUETE_NO = CL.ENQUETE_NO(+)
AND
QL.QUESTION_NO = CL.QUESTION_NO(+)


如果遇到那个,就把这个左链接变成右链接,即可!
theoffspring 2011-11-23
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 cosio 的回复:]
SQL code
SELECT
FI.SVCID,
FI.GROUPNO,
FI.ENQUETE_NO,
QL.QUESTION_NO,
QL.QUESTION,
QL.QTYPE,
CL.CHOICENO,
CL.CHOICETXT,
FI.START……
[/Quote]
实际上我一开始就是这么写的,但报错:ORA-01417: a table may be outer joined to at most one other table,关键是三个表,交互关联,FI先把QL和CL左连接进来,通过ENQUETENO,然QL又和CL通过QUESTIONNO关联,我不知道这叫啥关联
theoffspring 2011-11-23
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 luiseradl 的回复:]
参考代码:
SQL code

SELECT
FI.SVCID, FI.GROUPNO, FI.ENQUETE_NO, QL.QUESTION_NO,
QL.QUESTION, QL.QTYPE, CL.CHOICENO, CL.CHOICETXT,
FI.STARTDT, FI.ENDDT
FROM INFO FI, QUESTION_……
[/Quote]
你这少了第三个条件:QL.QUESTIONNO = CL.QUESTIONNO
cosio 2011-11-23
  • 打赏
  • 举报
回复
SELECT 
FI.SVCID,
FI.GROUPNO,
FI.ENQUETE_NO,
QL.QUESTION_NO,
QL.QUESTION,
QL.QTYPE,
CL.CHOICENO,
CL.CHOICETXT,
FI.STARTDT,
FI.ENDDT
FROM
INFO FI
,QUESTION_LIST QL
,CHOICE_LIST CL
WHERE
FI.ENQUETE_NO = QL.ENQUETE_NO(+)
AND
FI.ENQUETE_NO = CL.ENQUETE_NO(+)
AND
QL.QUESTION_NO = CL.QUESTION_NO(+)
AND
FI.SVCID = 'XXX'
AND
FI.GROUPNO = 53
AND
FI.STARTDT < SYSDATE
AND
FI.ENDDT > SYSDATE
我心飞翔 2011-11-23
  • 打赏
  • 举报
回复
参考代码:

SELECT
FI.SVCID, FI.GROUPNO, FI.ENQUETE_NO, QL.QUESTION_NO,
QL.QUESTION, QL.QTYPE, CL.CHOICENO, CL.CHOICETXT,
FI.STARTDT, FI.ENDDT
FROM INFO FI, QUESTION_LIST QL, CHOICE_LIST CL
WHERE FI.ENQUETE_NO = QL.QL.ENQUETE_NO(+)
AND FI.ENQUETE_NO = CL.ENQUETE_NO(+)
AND FI.SVCID = 'XXX'
AND FI.GROUPNO = 53
AND FI.STARTDT < SYSDATE
AND FI.ENDDT > SYSDATE;


关于外连接的归纳如下:
在使用老的SQL标准的外连接查询语句时,(+)放在=的左边或右边分别对应叫做右外连接和左外连接;进行左外连接时,左面的表的数据全部显示出来;(+)放在哪个表的后面,就会将另一表中所有记录显示出来。
加载更多回复(1)

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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