标签: subquery

为什么这个查询有效?

我有两个表,table_a (id, name) 和 table_b (id),假设在 Oracle 12c 上。

为什么这个查询不返回异常?

select * from table_a where name in (select name from table_b);
Run Code Online (Sandbox Code Playgroud)

据我了解,Oracle 认为这是

select * from table_a where name = name;
Run Code Online (Sandbox Code Playgroud)

但我不明白的是为什么?

oracle subquery select

36
推荐指数
2
解决办法
5443
查看次数

从选择子查询中获取多列

SELECT 
   *, 
   p.name AS name, 
   p.image, 
   p.price,
   ( 
       SELECT ps.price 
       FROM product_special ps 
       WHERE p.id = ps.id
         AND ps.date < NOW() 
       ORDER BY ps.priority ASC, LIMIT 1
   ) AS special_price,
   ( 
       SELECT ps.date 
       FROM product_special ps 
       WHERE p.id = ps.id
         AND ps.date < NOW() 
       ORDER BY ps.priority ASC, LIMIT 1
   ) AS date
FROM product p LEFT JOIN product_special ps ON (p.id = ps.id)
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我重复相同的子查询只是为了得到另一列。我想知道有没有更好的方法来做到这一点?

id是两个表中的主键。如果有帮助,我可以让product_special.priority变得独一无二。

subquery

35
推荐指数
5
解决办法
16万
查看次数

子查询的别名与主查询的别名相同

我有一个 SQL 查询,其别名与其子查询的某些别名相同。

例如:

select *
from ROOM r
where ...
         (
              select *
              from ROAD r
              where ...
         )
Run Code Online (Sandbox Code Playgroud)

这很好用,因为子查询的别名似乎隐藏了主要的。

  1. 它会在所有情况下都这样工作吗?
  2. 我会得到未定义的结果吗?
  3. 如果可以这样做,我如何引用主查询的r

sql-server t-sql subquery alias

26
推荐指数
2
解决办法
4万
查看次数

使用子查询时 Postgres 错误 [列必须出现在 GROUP BY 子句中或用于聚合函数中]

我有两张桌子employeephones. 一个员工可以有 0 到 n 个电话号码。我想列出员工姓名及其电话号码。我正在使用以下运行良好的查询。

SELECT empname,array_agg(phonenumber) AS phonenumbers 
FROM employee LEFT OUTER JOIN phones ON employee.empid = phones.empid
GROUP BY employee.empid
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

员工表可能包含大量行。我想一次只取一些员工。例如,我想用他们的电话号码获取 3 名员工。我正在尝试运行此查询。

SELECT empname,array_agg(phonenumber) AS phonenumbers 
FROM 
(SELECT * FROM employee ORDER BY empname LIMIT 3 OFFSET 0) AS employee 
LEFT OUTER JOIN phones ON employee.empid = phones.empid
GROUP BY employee.empid
Run Code Online (Sandbox Code Playgroud)

但我收到这个错误。ERROR: column "employee.empname" must appear in the GROUP BY clause or be used in an aggregate function 两个查询之间的唯一区别是我在后者中使用子查询来限制加入之前的行。我该如何解决这个错误?

postgresql aggregate subquery group-by

25
推荐指数
1
解决办法
12万
查看次数

通过子查询选择多列

我正在尝试从以下查询中的子查询中选择 2 列,但无法这样做。尝试创建别名表,但仍然无法获取它们。

SELECT
  DISTINCT petid,
  userid,
  (SELECT MAX(comDate) FROM comments WHERE petid=pet.id) AS lastComDate,
  (SELECT userid FROM comments WHERE petid=pet.id ORDER BY id DESC LIMIT 1) AS lastPosterID
FROM 
  pet LEFT JOIN comments ON pet.id = comments.petid
WHERE 
  userid='ABC'      AND 
  deviceID!='ABC'   AND 
  comDate>=DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 2 MONTH);
Run Code Online (Sandbox Code Playgroud)

基本上,我试图从同一行获取lastComDate& lastPosterID- 特定宠物评论中的最新行。请建议我如何以有效的方式获得它们。

上面的查询有效,但由于同一行被提取两次似乎有点矫枉过正。此外,该ORDER BY子句比聚合函数慢得多 - 正如我在分析查询时发现的那样。因此,避免排序的解决方案将不胜感激。

mysql performance subquery select

24
推荐指数
2
解决办法
13万
查看次数

在 WHERE 子句中使用列别名不起作用

给定一个users包含两个字段的表:idemail

select id, email as electronic_mail 
from (  
        select id, email 
        from users
) t 
where electronic_mail = ''
Run Code Online (Sandbox Code Playgroud)

Postgres 抱怨说:

ERROR:  column "electronic_mail" does not exist
Run Code Online (Sandbox Code Playgroud)

这个例子只是为了说明出现的问题。我的实际情况更复杂,我遍历 json 列中的元素数组,从每个元素中获取一个标量值。(如果有帮助,我可以分享一些代码。)

我真的不明白会有什么并发症,可能我不知道什么。我的印象是可以在WHERE子句中使用别名列而没有问题?

postgresql subquery alias where

19
推荐指数
2
解决办法
2万
查看次数

为什么子查询使用并行性而连接不使用?

为什么 SQL Server 在运行使用子查询的查询时使用并行性,但在使用连接时不使用并行性?加入版本串行运行,需要大约 30 倍的时间才能完成。

加入版本:~30secs

在此处输入图片说明

子查询版本:<1 秒

在此处输入图片说明

编辑: Xml 版本的查询计划:

加入版本

子查询版本

join sql-server subquery

16
推荐指数
1
解决办法
1271
查看次数

使用子查询对大表进行缓慢更新

由于SourceTable具有 >15MM 记录和Bad_Phrase>3K 记录,以下查询需要将近 10 个小时才能在 SQL Server 2005 SP4 上运行。

UPDATE [SourceTable] 
SET 
    Bad_Count=
             (
               SELECT 
                  COUNT(*) 
               FROM Bad_Phrase 
               WHERE 
                  [SourceTable].Name like '%'+Bad_Phrase.PHRASE+'%'
             )
Run Code Online (Sandbox Code Playgroud)

在英语中,这个查询计数Bad_Phrase列出不同的短语是一个子领域的数量NameSourceTable,然后把该结果在现场Bad_Count

我想要一些关于如何让这个查询运行得更快的建议。

sql-server-2005 sql-server subquery update

16
推荐指数
2
解决办法
1519
查看次数

如何使用子查询进行 SQL 删除

我们的一位开发人员添加了以下代码以从表中删除重复记录:

DELETE  SubQuery

FROM
(
    SELECT  ID
            ,FK1
            ,FK2
            ,CreatedDateTime
            ,ROW_NUMBER() OVER(PARTITION BY FK1, FK2 ORDER BY CreatedDateTime) AS RowNumber

    FROM    Table
)
AS SubQuery

WHERE   RowNumber > 1
Run Code Online (Sandbox Code Playgroud)

在查看代码时,我认为它不起作用,但是在我们的测试环境 (SQL 2014) 中测试它表明它起作用了!

SQL 如何知道解析子查询并从中删除记录table

sql-server subquery sql-server-2014

15
推荐指数
1
解决办法
3577
查看次数

带有日期比较的子查询性能不佳

当使用子查询查找具有匹配字段的所有先前记录的总数时,在只有 50k 条记录的表上性能很差。如果没有子查询,查询会在几毫秒内执行。对于子查询,执行时间超过一分钟。

对于此查询,结果必须:

  • 仅包括给定日期范围内的那些记录。
  • 包括所有先前记录的计数,不包括当前记录,无论日期范围如何。

基本表模式

Activity
======================
Id int Identifier
Address varchar(25)
ActionDate datetime2
Process varchar(50)
-- 7 other columns
Run Code Online (Sandbox Code Playgroud)

示例数据

Id  Address     ActionDate (Time part excluded for simplicity)
===========================
99  000         2017-05-30
98  111         2017-05-30
97  000         2017-05-29
96  000         2017-05-28
95  111         2017-05-19
94  222         2017-05-30
Run Code Online (Sandbox Code Playgroud)

预期成绩

对于日期范围2017-05-29,以2017-05-30

Id  Address     ActionDate    PriorCount
=========================================
99  000         2017-05-30    2  (3 total, 2 prior to ActionDate)
98  111         2017-05-30    1  (2 total, 1 prior to ActionDate) …
Run Code Online (Sandbox Code Playgroud)

performance subquery azure-sql-database query-performance

15
推荐指数
1
解决办法
421
查看次数