标签: subquery

缓存/重用MySQL中的子查询

我有一个非常复杂的MySQL查询,包括使用相同的子查询三次.MySQL实际上会运行子查询三次吗?(这是一个昂贵的.)如果是这样,有没有办法告诉MySQL保存或缓存结果,所以它不会这样做?我可以将数据保存在一个大型数组中,然后将其重新提供给MySQL,但我宁愿不将它移出并重新进入数据库.

这是三次出现的子查询:

SELECT id FROM programs 
WHERE submitter_id=32 AND id in (
    SELECT id FROM programs 
    WHERE feed_id=2478 AND id in (
        SELECT program_id FROM playlist_program_map 
        WHERE playlist_id=181)))
Run Code Online (Sandbox Code Playgroud)

这是查询出现的完整查询的示例:

SELECT object_id, programs.created AS created, 
MATCH(text) AGAINST ('excellent ' IN BOOLEAN MODE) AS relevance 
FROM comments_programs USE INDEX (text) 
LEFT JOIN programs ON programs.id=object_id 
WHERE object_id IN (
    SELECT id FROM programs 
    WHERE 1 AND id IN (
        SELECT id FROM programs 
        WHERE submitter_id=32 AND id in (
            SELECT id FROM …
Run Code Online (Sandbox Code Playgroud)

mysql subquery

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

如何在MySQL的左连接中获取关联行的计数?

我有两个表,一个vehicle带列的表:

  • id
  • stock
  • year
  • make
  • model

和一个images包含列的表:

  • id
  • vehicle_id
  • name
  • caption
  • default tinyint(1)

我正在尝试列出车辆的信息,默认图像以及车辆的图像总数.目前我使用以下SELECT声明:

SELECT vehicle.id, vehicle.stock, vehicle.year,
    vehicle.make, vehicle.model, images.name,
    COUNT(images.id)
FROM vehicle
LEFT JOIN images
ON vehicle.id = images.vehicle_id
Run Code Online (Sandbox Code Playgroud)

我最初使用的是:

ON vehicle.id = images.vehicle_id AND images.default = 1
Run Code Online (Sandbox Code Playgroud)

但是,如果数据库中存在默认图像,则图像计数将仅为1或0.我尝试过使用UNION和其他SELECT语句,但我仍然无法得到正确的结果.我需要用两个SELECT语句或有另一种方式与处理呢JOIN还是UNION

mysql sql select join subquery

14
推荐指数
3
解决办法
1万
查看次数

使用subselect完成LEFT JOIN

是否可以通过subselect实现LEFT JOIN的等效,其中需要多列.这就是我的意思.

SELECT m.*, (SELECT * FROM model WHERE id = m.id LIMIT 1) AS models FROM make m
Run Code Online (Sandbox Code Playgroud)

现在这样做,这给了我一个'操作数应该包含1列'的错误.

是的我知道LEFT JOIN可以做到这一点,但我被告知可以通过subselect我很好奇它是如何完成的.

sql subquery multiple-columns

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

有没有办法在Oracle 11g SQL中为子查询提供别名?

有没有办法在Oracle 11g中为子查询提供如下别名:

select * 
from
    (select client_ref_id, request from some_table where message_type = 1) abc,
    (select client_ref_id, response  from some_table where message_type = 2) defg
where
    abc.client_ref_id = def.client_ref_id;
Run Code Online (Sandbox Code Playgroud)

否则,有一种方法可以基于client_ref_id加入两个子查询.我意识到有一个自连接,但在数据库上我运行的自连接可能需要5分钟才能完成(在我运行的实际查询中有一些额外的逻辑,但我已确定自联接是什么导致问题).各个子查询只需几秒钟即可完成.自联接查询类似于:

select st.request, st1.request
from
    some_table st, some_table st1
where 
    st.client_ref_id = st1.client_ref_id;
Run Code Online (Sandbox Code Playgroud)

sql oracle subquery oracle11g table-alias

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

Hibernate Subselect与批量提取

Hibernate提供(至少)两个选项来解决N + 1查询问题.一个是将FetchMode设置为Subselect,它在该IN子句中生成带有IN子句和子选择的选择.另一种是指定BatchSize,它生成一个带有包含父项ID的IN子句的select.

两者都有效但我发现Subselect选项经常遇到性能问题,因为查询父项很复杂.另一方面,使用大型BatchSize(比如1000),查询的数量和这些查询的复杂性非常小.

我的问题是:你何时会在BatchSize上使用Hibernate的Subselect FetchMode?如果您有非常多的父条目(数千),则子选择可能有意义,但是在其他任何情况下您更喜欢Subselect到BatchSize吗?

编辑:我注意到在处理急切加载时两者之间存在差异.如果您将xToMany关联设置为热切地并通过子选择加载,则会生成一个子选择,就像它是懒惰一样.但是,如果指定BatchSize,则生成的查询将使用外部联接而不是单独的查询.有没有办法迫使Hibernate在急切加载时使用单独的批量查询?

hibernate subquery select-n-plus-1

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

有子句与子查询

我可以用两种方式使用聚合函数编写查询:

select team, count(min) as min_count
from table
group by team
having count(min) > 500
Run Code Online (Sandbox Code Playgroud)

要么

select * 
from (
    select team, count(min) as min_count
    from table
    group by team
) as A
where A.min_count > 500
Run Code Online (Sandbox Code Playgroud)

这两种方法是否有任何性能优势,或者它们在功能上是否相同?

sql subquery having

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

子查询返回的值超过1.当子查询跟随=,!=,<,<=,>,> =或子查询用作表达式时,不允许这样做

我有一个存储过程select * from book table,使用子查询我的查询是

USE [library]
GO

/****** Object:  StoredProcedure [dbo].[report_r_and_l]    Script Date: 04/17/2013 12:42:39 ******/

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

ALTER procedure [dbo].[report_r_and_l]
@fdate date,
@tdate date,
@key varchar(1)
as

if(@key='r')

    select * 
    from dbo.books 
    where isbn =(select isbn from dbo.lending where (act between @fdate and @tdate) and (stat ='close'))

else if(@key='l')

    select * 
    from dbo.books 
    where isbn =(select isbn from dbo.lending where lended_date between @fdate and @tdate)
Run Code Online (Sandbox Code Playgroud)

我知道子查询返回多个查询到主查询,但我不知道如何避免这个错误,任何人都可以帮助我吗?

sql-server subquery

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

SQL连接子查询

我试图寻找我的问题的答案,但没有得到实际帮助的答案.我写了一个sql代码,但似乎无法找到问题所在.是否可以在"FROM"部分放置子查询?

SELECT S2.ITEM,
       S1.SHOP_ORDER,
       S1.OPERATION_NO,
       S1.START_DATE,
       S1.QTY_GOODS,
       S1.QTY_ENTERED,
       S1.QTY_MRB
FROM   (SELECT SHOP_ORD_RPT.OPERATION_NO,
               SHOP_ORD_RPT.SHOP_ORDER
        FROM   FLAME.SHOP_ORD_RPT
        WHERE  SHOP_ORD_RPT.OPERATION_NO = 110
                OR SHOP_ORD_RPT.OPERATION_NO = 370) AS S1
       JOIN (SELECT SHOP_ORD.SHOP_ORDER
             FROM   FLAME.SHOP_ORD
             WHERE  SHOP_ORD.ITEM = '3A2375'
                     OR SHOP_ORD.ITEM = '3A2703')AS S2
         ON S1.SHOP_ORDER = S2.SHOP_ORDER; 
Run Code Online (Sandbox Code Playgroud)

我在运行脚本时收到的错误是:

SQL命令未正确结束

如果有人能提供帮助我会很感激.非常感谢 - 露丝

sql oracle join subquery

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

SELECT与多个子查询到同一个表

我一遍又一遍地使用相同的SQL模式,我知道必须有更好的方法,但我无法将它拼凑在一起.这是模式的一个简单版本,我将撤回学生的信息和他们签出的最后一本书(如果存在的话):

SELECT TStudents.*,
       BookName = (SELECT TOP 1 BookName 
                     FROM TBookCheckouts 
                    WHERE StudentID = TStudents.ID 
                 ORDER BY DateCheckedOut DESC),
       BookAuthor = (SELECT TOP 1 BookAuthor 
                       FROM TBookCheckouts 
                      WHERE StudentID = TStudents.ID 
                   ORDER BY DateCheckedOut DESC),
       BookCheckout = (SELECT TOP 1 DateCheckedOut 
                         FROM TBookCheckouts 
                         WHERE StudentID = TStudents.ID 
                     ORDER BY DateCheckedOut DESC)
   FROM TStudents
Run Code Online (Sandbox Code Playgroud)

(为了这个例子,请忽略TBookCheckouts应该分成TCheckouts和TBooks的事实)

我想说明的是:我倾向于为同一个表中的列提供大量子查询.我也倾向于需要按日期对这些子查询表进行排序以获得最新记录,因此对于LEFT JOIN来说,这并不是那么简单(至少对我而言).但是请注意,除了返回哪个字段之外,我基本上做了3次相同的子查询.SQL Server可能足够聪明以优化它,但我不这么认为(我肯定需要在阅读执行计划方面做得更好......).

虽然以这种方式构造它可能是有利的(如果我有大量的子查询和子表,有时这最终会更具可读性),但这似乎并不是特别有效.

我已经考虑从派生表执行LEFT JOIN,可能包含ROW_NUMBER()和PARTITION BY,但我似乎无法将它们拼凑在一起.

sql t-sql sql-server subquery

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

带有主查询数据变量的MySQL子查询

好的,这里需要一个MySQL大师.我正在尝试编写一个查询,当有人对您之前评论过的项目发表评论时,该查询将作为通知系统.'drinkComment'表非常简单:

commentID, userID, drinkID, datetime, comment
Run Code Online (Sandbox Code Playgroud)

我写了一个查询,它将获得我之前评论过的所有关于饮料的评论(这不是我的评论),但它仍会显示我评论之前发生的评论.这与我认为可行的一样接近,但事实并非如此.请帮忙!

select @drinkID:=drinkComments.drinkID, commentID, drinkID, userID, comment, datetime 
FROM drinkComments  
WHERE `drinkID` IN 
    ( select distinct drinkID from drinkComments where drinkComments.userID = 1) 
AND drinkComments.dateTime > (
/*This gets the last date user commented on the main query's drinkID*/
select datetime FROM drinkComments WHERE drinkComments.userID = 1 AND drinkComments.drinkID = @drinkID ORDER BY datetime DESC LIMIT 1
)
ORDER BY datetime DESC
Run Code Online (Sandbox Code Playgroud)

mysql select subquery

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