Sql 假设您运行以下查询: select userName, instrument from allEmployees inner join employeeDetails using (userName)
您应该得到以下结果:Sql 假设您运行以下查询: select userName, instrument from allEmployees inner join employeeDetails using (userName),sql,oracle,plsql,for-loop,foreach,Sql,Oracle,Plsql,For Loop,Foreach,您应该得到以下结果: userName instrument JOHN guitar PAUL bass GEORGE guitar RINGO drums 当然,这回避了一个问题:“那么皮特和厄尔怎么了?”。答案是,内部联接要求两个表中都有数据,并且因为userDetails中没有userName='PETE'的行,所以没有为该用户名返回任何数据。类似地,在所有员工中都没有用户名为“EARL”的行,所以这是再见,EARL 相反,如果您总
userName instrument
JOHN guitar
PAUL bass
GEORGE guitar
RINGO drums
当然,这回避了一个问题:“那么皮特和厄尔怎么了?”。答案是,内部联接要求两个表中都有数据,并且因为userDetails中没有userName='PETE'的行,所以没有为该用户名返回任何数据。类似地,在所有员工中都没有用户名为“EARL”的行,所以这是再见,EARL
相反,如果您总是希望返回allEmployees表中的每个用户,并在这些用户可用时提供详细信息,则可以使用外部联接,方式与
select userName, instrument
from allEmployees
left outer join employeeDetails
using (userName)
在这种情况下,你会得到类似于
userName instrument
JOHN guitar
PAUL bass
GEORGE guitar
PETE NULL
RINGO drums
userName instrument
JOHN guitar
PAUL bass
GEORGE guitar
PETE NULL
RINGO drums
EARL banjo
还有皮特,又回来了,但没有详细资料。尽管如此,仍然没有伯爵,因为伯爵在所有雇员中没有争吵
使用完全联接可以恢复所有数据,如中所示
select userName, instrument
from allEmployees
full join employeeDetails on (userName)
这应该会产生类似于
userName instrument
JOHN guitar
PAUL bass
GEORGE guitar
PETE NULL
RINGO drums
userName instrument
JOHN guitar
PAUL bass
GEORGE guitar
PETE NULL
RINGO drums
EARL banjo
我希望这会有所帮助。正如我在评论中提到的,您通常会希望找到基于集合的解决方案。然而,DB制造商已经给了我们(或其他)当我们真的想要运行一系列更容易以程序化方式表达的处理时。在这里,光标可能很合适。如果重新构建数据库超出了您的范围,例如将案例/开关逻辑放入表中,那么这一点可能尤其正确。如果光标性能不可接受,您可能需要重新查找基于集合的解决方案。正如我在评论中提到的,您通常需要查找基于集合的解决方案。然而,DB制造商已经给了我们(或其他)当我们真的想要运行一系列更容易以程序化方式表达的处理时。在这里,光标可能很合适。如果重新构建数据库超出了您的范围,例如将案例/开关逻辑放入表中,那么这一点可能尤其正确。如果光标性能不可接受,您可能需要重新寻找基于集合的解决方案。正如答案所示,您可能需要从集合而不是过程的角度来思考。SQL毕竟是一种声明性语言。或者,如果您确实需要基于每行中的值进行不同的处理,那么可以在PL/SQL中使用游标。谢谢。蒂姆-我成功地编写了光标代码,它对我起了作用。如果你想把你的评论转移到一个答案上,我会把它标记为已接受的答案。正如答案所示,也许你需要从集合而不是过程的角度来思考。SQL毕竟是一种声明性语言。或者,如果您确实需要基于每行中的值进行不同的处理,那么可以在PL/SQL中使用游标。谢谢。蒂姆-我成功地编写了光标代码,它对我起了作用。如果你想把你的评论转移到一个答案上,我会把它标记为已接受的答案。鲍勃-谢谢你对加入的非常翔实的重述。然而,我认为Tim说我需要使用cursorBob是正确的——感谢您对连接进行了非常翔实的回顾。然而,我认为Tim说我需要使用游标是正确的,他遵循了您提供的链接中的游标教程,并在第一次尝试时进行了工作。很好的资源。我遵循了您提供的链接中的光标教程,并在第一次尝试时进行了工作。巨大的资源。
allEmployees
userName
JOHN
PAUL
GEORGE
PETE
RINGO
employeeDetails
userName lastName instrument
JOHN Lennon guitar
PAUL McCartney bass
GEORGE Harrison guitar
RINGO Starr drums
EARL Scruggs banjo
select userName, instrument
from allEmployees
inner join employeeDetails
using (userName)
userName instrument
JOHN guitar
PAUL bass
GEORGE guitar
RINGO drums
select userName, instrument
from allEmployees
left outer join employeeDetails
using (userName)
userName instrument
JOHN guitar
PAUL bass
GEORGE guitar
PETE NULL
RINGO drums
select userName, instrument
from allEmployees
full join employeeDetails on (userName)
userName instrument
JOHN guitar
PAUL bass
GEORGE guitar
PETE NULL
RINGO drums
EARL banjo