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