Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 查找匹配外键并返回匹配结果的查询?_Sql_Oracle_Join - Fatal编程技术网

Sql 查找匹配外键并返回匹配结果的查询?

Sql 查找匹配外键并返回匹配结果的查询?,sql,oracle,join,Sql,Oracle,Join,我正在学校学习Oracle SQL,我有一个不知道如何解决的问题。我有几个表,一个是员工表,一个是工作表。employee表包含一些信息,包括姓名、地址、职务代码等。职务代码是职务表的外键,它将职务代码与职务名称相匹配。我被要求写一份声明,返回出纳的姓名,同时假设我不知道出纳职位的工作代码 我想到的唯一方法是在职务表中搜索“出纳”并获取职务代码,然后使用该职务代码返回具有该职务代码的员工。我想一旦我有了工作代码,我会使用连接,但我不知道如何在第一时间找到工作代码。有什么方法可以做到这一点吗?在回

我正在学校学习Oracle SQL,我有一个不知道如何解决的问题。我有几个表,一个是员工表,一个是工作表。employee表包含一些信息,包括姓名、地址、职务代码等。职务代码是职务表的外键,它将职务代码与职务名称相匹配。我被要求写一份声明,返回出纳的姓名,同时假设我不知道出纳职位的工作代码


我想到的唯一方法是在职务表中搜索“出纳”并获取职务代码,然后使用该职务代码返回具有该职务代码的员工。我想一旦我有了工作代码,我会使用连接,但我不知道如何在第一时间找到工作代码。有什么方法可以做到这一点吗?

在回答中收集我通过评论分享的一些想法:

显而易见的解决方案是-连接这两个表,不需要知道该表的作业代码,然后在where子句中筛选出纳员。应注意出纳的大写字母-它应与表中存储的内容相匹配。如果表中的出纳大写字母C,则where条件也应为。有解决办法,但这是最好的选择

select e.first_name, e.last_name
from   employee e join job j on e.job_code = j.job_code
where  j.job_name = 'cashier'
这似乎需要做很多工作:如果我们只对收银员感兴趣,为什么我们要将这两个表完全连接起来?如果作业表有许多行,会不会导致大量的工作浪费?我们只需要那张桌子的一排

这是正确的。编写查询时最好先进行过滤,然后再进行连接。比如:

select e.first_name, e.last_name
from   employee e join ( select job_code from job where job_name = 'cashier') j
                  on e.job_code = j.job_code
幸运的是,即使我们以第一种形式编写查询,基于成本的优化器(查询解析器/编译器的基本组件)也会将其转换为第二种形式。如果您熟悉解释计划,您可以尝试:编写两个类似于这些查询的查询,您将看到解释计划是相同的

这是对开发者的不干预,它让我们有一点灵活性,当我提到自己时,我认为这是懒惰。

当然,第二种形式表明,在编写查询时也可以完全不使用连接:

select e.first_name, e.last_name
from   employee
where  job_code = ( select job_code from job where job_name = 'cashier' )

此查询在where子句中使用标量子查询,该子查询在一列中只生成一行。

Hint:JOIN。这将合并两个表。使用联接正是为了不必知道作业代码。您将job_code列上的两个表连接起来-现在您有了长行,其中有每个员工的姓名和地址,还有job表中关于他们工作的所有信息,而您仍然不知道这两个表中存在哪些job_code值。即使如此,现在加入,您可以过滤where子句,只选择其工作描述在任何列中为“出纳”的员工。然后,您可以在select中只选择员工姓名,或者选择您需要的任何内容。@mathguy啊,我不知道联接是如何工作的。我认为连接必须知道每个表的匹配值才能返回任何内容。谢谢。进入一个更高级的级别:如果您编写这样的查询连接两个表,并且有一个where子句只选择出纳员,您可能会觉得这是一个事半功倍的工作——为什么不先获取出纳员的工作代码,然后再连接表呢。您确实可以这样编写查询。更好的是:即使您先按顺序join然后按where子句编写查询,基于Oracle成本的优化器也会为您重写查询,以便它先在作业表上执行where条件,然后才执行join。你不必担心它!。。。当然,你可以先得到工作代码,然后用它来得到名字,甚至不用写在任何地方!我在刚刚发布的答案中展示了我是如何做到这一点的。