我可以在 SQL 中一起做成对和非成对子查询吗

Posted

技术标签:

【中文标题】我可以在 SQL 中一起做成对和非成对子查询吗【英文标题】:Can I do pairwise and non-pairwise subquery together in SQL 【发布时间】:2018-06-12 14:49:00 【问题描述】:

我正在尝试运行一个使用一个成对子查询和一个非成对子查询的查询。当主查询的条件是“和”(两个子查询都需要匹配)时,它返回零行,它应该返回两行(以图形方式检查)。但是,当条件为“或”时,主查询有效。 SQL中是否禁止此类事务?

由于列名等原因,我无法给出实际查询,因为它太长了,但是这个例子确实代表了这种情况 -

select ...
from <tablename>
-- tuple (pairwise) comparison
where (columnA, columnB) in (select columnA, columnB 
                             from <tablename> 
                             where <some_condition_1>)
-- single column comparison
AND columnC in (select columnC 
                from <tablename> 
                where <some_condition_2>);

执行此查询时,我没有得到任何结果(无;空白表),但是当我用 OR 替换 AND 时,我得到了结果(虽然不是想要的结果)。这不是我必须执行的查询,但我正在尝试了解这是否真的有效。也许有一天,这样的查询对我或其他人可能会派上用场。

我正在使用 Oracle 11g XE。但是,如果不同 RDBMS(如 Postgres 或 SQL Server)的解决方案不同,请尽可能提及它们。我也在学习这些。

【问题讨论】:

很难理解你在做什么。请发布一个可重现的测试用例 - 表格、示例数据和您的查询 - 证明您的问题。 查询是完全有效的(虽然不是在 SQL Server 中)。使用 AND 时它不返回任何内容的事实与语法无关。它只是意味着没有满足两个条件的行。 我试图按组绘制出这个查询的解决方案,结果就在那里。也许我应该再次检查解决方案... 【参考方案1】:

我尝试使用版本 12c 中的 HR 模式进行类似查询,它似乎可以工作。

SELECT *
FROM   employees
WHERE  (manager_id, department_id) IN (SELECT manager_id,
                                                department_id
                                         FROM   employees
                                         WHERE  first_name = 'John')
AND job_id IN (SELECT job_id
               FROM   employees
               WHERE  last_name = 'Faviet')
; 

这应该返回 5 行。

【讨论】:

以上是关于我可以在 SQL 中一起做成对和非成对子查询吗的主要内容,如果未能解决你的问题,请参考以下文章

如何使用ARel对子查询进行连接?

SQL案例分析-地铁换乘线路查询.sql

SQL 基础之子查询

SQL嵌套SELECT语句的用法-

Oracle - 子查询TOP - N

Hibernate中使用子查询