sql - 一个或另一列中的值

标签 sql oracle

下面的代码只是一个简化的描述,由于数据集的原因,查询的结构必须是这样的。

我想查找子查询的两列中可能存在值的条目。

这就是我现在拥有的:

SELECT * FROM PEOPLE WHERE RELATION = 'child' 
and (
    'John' IN (SELECT FIRSTNAME FROM PEOPLE WHERE AGE = 20 AND RELATION = 'parent' ) OR 
    'John' IN (SELECT ALIAS FROM PEOPLE WHERE AGE = 20 AND RELATION = 'parent')
) ;

我发现 OR 的性能非常糟糕。

我想要实现的是:

SELECT * FROM PEOPLE WHERE RELATION = 'child' AND 'John' IN 
(SELECT FIRSTNAME, ALIAS FROM PEOPLE WHERE AGE = 20 AND RELATION = 'parent');

此示例中的名字和别名不一定是相同的值,因此我无法使用:

SELECT * FROM PEOPLE WHERE RELATION = 'child' AND ('John','John') IN 
(SELECT FIRSTNAME, ALIAS FROM PEOPLE WHERE AGE = 20 AND RELATION = 'parent');

因为这只会找到 FIRSTNAME = ALIAS = 'John' 的整体。

有比现在更好的方法吗?

最佳答案

可能是这样的吗?

SELECT * 
FROM   people 
WHERE  relation = 'child' 
       AND EXISTS (SELECT 1 
                   FROM   people 
                   WHERE  age = 20 
                          AND relation = 'parent' 
                          AND ( firstname = 'john' 
                                 OR alias = 'john' )) ;

关于sql - 一个或另一列中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49957521/

相关文章:

sql - 使用 DAO.Recordset 编辑、更新记录

sql - 查找在具有相同字段的两个表之间未共享的 SQL 行

javascript - 在 Wordpress 主题中使用 AJAX 的 SQL 查询

java - 需要有关修复我的 JAVA 查询语句的建议吗?

sql - 为什么 Oracle 在取消引用对象时需要 View 中列的别名?

sql - 如何在 SQL 中使用选择查询生成 csv 文件

MySQL NOT IN 不起作用

sql - Oracle SQL WHERE 子句中的 (+) 符号是什么意思?

oracle - 如何使用一个Alter table语句重命名oracle中的多个列?

java - PreparedStatement如果Error则继续插入