2016-11-14 59 views
0

给定一个SQL数据库具有以下表SQL JOIN当至少有一个表包含所需的值时:可以在单个查询中实现吗?

  • 表科

    • branch_Id INT主键
  • 表系

    • DEPT_ID INT主键
    • branch_Id INT
  • 表Branch_Desc

    • branch_Id INT主键
    • branch_Desc VARCHAR
  • TABLE Department_Desc

    • departmen T_ID INT主键
    • department_Desc VARCHAR

是否有可能在表中返回高于匹配值的列表如下要求:

“列出所有的分支部门,分公司的描述和部门描述至少有一个描述(分部或部门)符合期望值“?

这里的窍门是,查询应该返回仅匹配的描述,所以如果我们有以下情形:

Branch: 1, Desc: test 
Branch: 2, Desc: another 
Department: 1, Desc: another 
Department: 1, Desc: something else 

将所需的值是“另一个”查询应该返回:

Branch: 2, Branch Desc: another, Department: 1, Dept Desc: another 

科说明:“测试”和DEPT说明“别的东西”不应该被返回,也不应科1.

假设表结构不能改变是否可以编写一个SQL查询来返回正确的结果?

到目前为止,我得到的最接近的是:

SELECT br.branch_id, bd.branch_desc, de.dept_id, dd.dept_desc 
FROM branch br 

LEFT JOIN branch_desc bd 
ON bd.branch_id = br.branch_id 
AND UPPER(br.branch_desc) = 'value' 

JOIN department de 
ON br.branch_id = de.branch_id 

LEFT JOIN department_desc dd 
ON de.dept_id = dd.dept_id 
AND UPPER(dd.dept_desc) = 'value' 

如果至少一个部门包含了“价值”然而,当任何部门包括所需的描述则没有行返回的描述(这将返回正确的值即使有一个分支的描述符合“价值”)

在这一点上,我认为两个单独的查询需要,实现在所有四个可能的方案正确的结果:

  1. 两个分公司和部门都包含与“价值”
  2. 唯一分支机构包含符合“价值”
  3. 只有系包含符合“价值”
  4. 无论是分公司,也没有系包含说明的是匹配值
  5. 这说明这说明该说明

如果这是可能的(我有一种感觉,它一定是),我将不胜感激任何指导正确的方向。

在此先感谢!

+0

你为什么加入ON dd.dept_id = dd.dept_id和de.branch_id = de.branch_id?你几乎加入了同一张桌子。可能是你的问题。 – NonProgrammer

+0

如果分支描述是“something”,并且该分支的部门名称是“another”,并且您在“another”上搜索,您希望它返回一行吗? – JNevill

+0

或..如果“另一个”部门有15个分支。想要返回所有15个分支......或者您只需要知道有一个匹配的部门。如果你只需要知道有10个匹配的部门和2个匹配的分支,那么这将是两个单独的查询和一个联合将结果集合在一起......这正是我所掌握的。 – JNevill

回答

0

当你有一个规范,上面写着“符合这样或那样的”在SQL UNION考虑的是analoguous逻辑OR

SELECT dept_Id, branch_Id, 
     Branch_Desc AS branch_or_department_description 
    FROM Department 
     NATURAL JOIN 
     Branch_Desc 
    UNION 
    SELECT dept_Id, branch_Id, 
     department_Desc AS branch_or_department_description 
    FROM Department 
     NATURAL JOIN 
     (SELECT department_Id AS dept_id, department_Desc FROM Department_Desc) AS d; 

应用搜索条件(branch_or_department_description = '<search text>')你的hve各种选择例如创建一个VIEW,使用派生表等。

+0

正如您所建议的那样,abd @JNevill UNION可以用来实现这一点。在我的情况下,我必须使用UNION ALL,因为比较Oracle中的CLOB的问题(请参阅(http://stackoverflow.com/questions/17732302/error-ora-00932-when-using-a-select-with-union -and-CLOB场) – Max

0

您在连接中有两个错误。 下面我解决了这些问题,并在WHERE子句中使用了OR。

SELECT br.branch_id, bd.branch_desc, de.dept_id, dd.dept_desc 
FROM branch br 
INNER JOIN branch_desc bd ON db.branch_id = br.branch_id 
INNER JOIN department de ON de.branch_id = br.branch_id 
--note error in your code above and below 
INNER JOIN department_desc dd ON dd.dept_id = de.dept_id 
WHERE UPPER(br.branch_desc) = 'value' 
    OR UPPER(dd.dept_desc) = 'value'; 
+0

嗨,添加OR会导致查询返回不匹配“值”的描述。说dept_id 5有以下描述'价值','另一个'。在这种情况下,当我只想返回'value'时,查询将返回dept_id 5和'value'和'another'一起 – Max

相关问题