标签: subquery

两个不同表上的并发更新失败

我使用 PostgreSQL 和以下数据库架构:

CREATE TABLE plans (
    slug VARCHAR(500) PRIMARY KEY
);

CREATE TABLE users (
    id VARCHAR(16) PRIMARY KEY,
    org_id VARCHAR(16) NOT NULL
);

CREATE TABLE orgs (
    id VARCHAR(16) PRIMARY KEY,
    plan_slug VARCHAR(500) NOT NULL,
    last_write_at DOUBLE PRECISION
);
Run Code Online (Sandbox Code Playgroud)

就我而言,我想编写一个查询来更新某些组织plan_slug并保护它免受其他可能的并发更新的影响。为此,我SELECT在子查询中使用 a 并按FOR UPDATE特定顺序锁定行以避免死锁。就像下面的查询一样:

UPDATE orgs
SET plan_slug = 'plan_1'
WHERE id = ANY(
    SELECT subquery_orgs.id
    FROM orgs AS subquery_orgs
    JOIN users ON users.org_id = subquery_orgs.id
    WHERE users.id = ANY('{user_1, user_2, user_3}')
    ORDER …
Run Code Online (Sandbox Code Playgroud)

postgresql deadlock subquery update where

4
推荐指数
1
解决办法
358
查看次数

PostgreSQL 9.1 - 查询视图需要很多时间

使用 PostgreSQL 9.1,我们在 PostgreSQL 的 VIEW 上执行查询时遇到问题。以下是情况:

我们有一个分区表“buz_scdr”,我们在它上面构建了一个视图“Swiss_client_wise_minutes_and_profit”。此 VIEW 的目的是连接来自不同表(包括“buz_scdr”表)的数据以进行高效查询。这个策略一直运行良好,直到表“buz_scdr”变得巨大(所有分区中的整体记录变得巨大。该表基于日期进行分区)。

在此 VIEW 上执行的查询开始需要很长时间(大约 5 到 10 分钟)。为了弄清楚为什么这个查询需要这么长时间才能执行,我们使用 EXPLAIN 命令来显示它的执行计划。我们使用的查询如下:

EXPLAIN SELECT * from  "Swiss_client_wise_minutes_and_profit" where start_time = '2012-7-22 08:00';
Run Code Online (Sandbox Code Playgroud)

其结果在explain.depesz.com 上或如下:

   Subquery Scan on "Swiss_client_wise_minutes_and_profit"  (cost=2127919.71..94874537.55 rows=40474 width=677)
   Filter: ("Swiss_client_wise_minutes_and_profit".start_time = '2012-07-22 08:00:00+00'::timestamp with time zone)
   ->  WindowAgg  (cost=2127919.71..94773352.06 rows=8094839 width=148)
         ->  Sort  (cost=2127919.71..2148156.81 rows=8094839 width=148)
               Sort Key: cc.name, rdga.group_id
               ->  Hash Left Join  (cost=1661.50..604234.77 rows=8094839 width=148)
                     Hash Cond: (((cc.company_id)::text = (rdga.company_id)::text) AND ((cs.c_prefix_id)::text = (rdga.dest_id)::text))
                     ->  Hash …
Run Code Online (Sandbox Code Playgroud)

postgresql performance view partitioning subquery query-performance

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

查询花费太多时间

我的查询执行时间过长。请在这里帮助我。

mysql> explain 
select pcm.catalog_id 
from cat_produ_catal_map_defer pcm, cat_catal_catal_map_defer ccm, cat_catal_defer c  
where 
    pcm.product_id = 2520000  
    and ccm.catalog_id = pcm.catalog_id 
    and ccm.parent_catalog_id = 1000025 
    and levels <> 0 
    and c.catalog_id = pcm.catalog_id 
    and c.precedence is not null 
order by c.precedence;
+----+-------------+-------+------+--------------------------------------------+----------+---------+------------------------+------+-----------------------------+
| id | select_type | table | type | possible_keys                              | key      | key_len | ref                    | rows | Extra                       |
+----+-------------+-------+------+--------------------------------------------+----------+---------+------------------------+------+-----------------------------+
|  1 | SIMPLE      | c     | ALL  | idx_1031,idx_17109                         | NULL     | NULL    | NULL                   | …
Run Code Online (Sandbox Code Playgroud)

mysql performance execution-plan subquery query-performance

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

从多个字段与其他表中的选择子查询匹配的表中删除

我想删除表中的一个条目,其中多个字段与另一个选择子查询的结果相匹配,该查询从另一个表中获取数据。

这是我到目前为止所拥有的,尽管它不起作用:

DELETE FROM table1
WHERE table1.id IN
   (SELECT id
   FROM table1 a JOIN table2 b
   ON a.field1 = b.field1
   AND a.field2 = b.field2
   AND a.field3 = b.field3
   AND b.id = ?
   )
Run Code Online (Sandbox Code Playgroud)

mysql delete subquery select

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

交叉应用与内部连接

我最近阅读了很多关于CROSS APPLYvs 的文章INNER JOIN。我尝试编写一些查询,它们都以类似的方式工作,执行计划似乎也相同。

也许有更深入知识的人可以向我解释这两者之间的区别?

OUTER APPLY (SELECT UserID
                , ActionPerformedDate = MAX(ActionDate)
            FROM dbo.AdminUsage
            WHERE SubscriberID = S.SubscriberID
                AND ActionPerformed = 'Some Action'
                AND Description = 'True'
            GROUP BY UserID) AS AU


LEFT JOIN (SELECT SubscriberID
                , UserID
                , MAX(ActionDate) OVER(PARTITION BY SubscriberID) AS ActionPerformedDate
            FROM dbo.AdminUsage
            WHERE ActionPerformed = 'Some Action'
                AND Description = 'True') AS AU
    ON AU.SubscriberID = S.SubscriberID
Run Code Online (Sandbox Code Playgroud)

在这种情况下是否有首选方法?

join sql-server subquery

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

MYSQL 查询以查找两个日期范围之间的记录

我正在使用 PHP 和 MySQL 的 Web 应用程序中工作。

我有两张桌子

  1. 员工

    employee_id     email_id
    3             tl1@jasmine.com
    4             agent1@jasmine.com
    5             agent2@jasmine.com
    6             om1@jasmine.com
    7             tl2@jasmine.com
    
    Run Code Online (Sandbox Code Playgroud)
  2. 辅导

    coaching_id     emp_id  start_date  end_date
     1               4      2014-05-01  2014-10-02
     2               5      2014-12-18  2015-01-22
    
    Run Code Online (Sandbox Code Playgroud)

我想要查询以找出在指定日期范围(例如开始日期“2015-01-22”和结束日期“2015-03-12”)之间未注册任何辅导计划的员工。

现在我正在使用这样的查询,

SELECT employee_id 
FROM employee 
WHERE sup_id = 3 
AND employee_id NOT IN 
(
    SELECT emp_id 
    FROM (coaching) 
    WHERE (start_date NOT BETWEEN "2014-12-26" AND "2015-01-30") 
    AND (end_date NOT BETWEEN "2014-12-26" AND "2015-01-30")

)
Run Code Online (Sandbox Code Playgroud)

我有一个逻辑,“如果任何员工在给定的 start_date 和 end_date 已经加入了辅导计划,他就没有资格参加任何辅导计划。

例如:如果开始日期是“2014-12-26”,结束日期是“2015-01-30”。 …

mysql join subquery mysql-5.5

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

如何联合四个不同的表

我有两个表,它们都使用子查询。这两个表通过使用UNION ALL. 我还有另外两个只使用一个WHERE子句的表,并且这两个表都使用UNION ALL. 我正在努力加入所有 4 个表,因为我在使用UNION ALL和时一直低于错误UNION

消息 205,级别 16,状态 1,第 1 行所有使用 UNION、INTERSECT 或 EXCEPT 运算符组合的查询在其目标列表中必须具有相同数量的表达式。

t-sql subquery sql-server-2012 union

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

在 ANY() 条件中使用来自子查询的数组表达式

我有一个相对复杂的查询,其子查询获取一个数组,如下所示:

...
ARRAY(SELECT category_id FROM category_schedule_con con
      WHERE s.id = con.schedule_id ORDER BY category_id) AS cats,
...
Run Code Online (Sandbox Code Playgroud)

并希望在以后的 WHERE 条件中使用数组“cats”,例如

...
WHERE 4 = ANY(cats)
...
Run Code Online (Sandbox Code Playgroud)

但这不起作用,因为它指出“cats”列不存在。c/p'ing 子查询到ANY子句中会产生预期的结果。

postgresql syntax subquery

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

条件子查询

我有以下查询:

SELECT id,
   email,
   first_name as "firstName",
   last_name as "lastName",
   is_active as "isActive",
   password,
   access,
   CASE
     WHEN access < 3 THEN (
       SELECT
         CASE WHEN count(*) = 1 THEN true ELSE false END
       FROM user_rating_entity ure
       WHERE ure.user_id = u.id
         AND ure.rating_entity_id = :re_id
     )
     ELSE true
   END as "isResponsible"
FROM users u
WHERE u.id = :id
Run Code Online (Sandbox Code Playgroud)

如果access > 3,字段“isResponsible”应直接设置为true,并且不应执行子查询。我在这两种情况下都使用了解释分析,其中 access>=<to 3但我得到了相同的输出。

为什么呢?

postgresql optimization execution-plan subquery explain

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

加入是否导致其他列数据发生变化?

我会说,我是比较新的数据库和SQL,我试图做的除了率先ViewSQL Server这之前的同事创建的。

我正在尝试加入Customer_Snacks表格,以便我可以获得Snack Quantity每个客户的订单。我遇到的问题是,当我做一个LEFT OUTER JOIN,据我所知,应该工作时,其他一些列数据发生了巨大的变化。

我设法通过使用子查询使其按照我希望的方式工作,但速度非常慢。运行查询需要一分钟多的时间,作为回报,调用该视图的应用程序超时。

这是我目前有效的(我知道,它很乱):

SELECT
    cl.CustomerID,
    cl.FirstName + ' ' + c.LastName as CustomerDisplay,
    cl.InvoiceID,
    cl.MealPlanID,
    mp.DeliveryDate1 as DeliveryDate,
    SUM(CASE WHEN cll.Name = 'Meal' THEN cll.Quantity ELSE 0 END) as RegularQuantity,
    SUM(CASE WHEN cll.Name = 'Meal' THEN cll.Quantity * Amount ELSE 0 END) as RegularTotal,
    SUM(CASE WHEN cll.Name = 'EXTRAPROTEINMEAL' THEN cll.Quantity ELSE 0 END) as ProteinQuantity,
    SUM(CASE WHEN cll.Name = 'EXTRAPROTEINMEAL' THEN cll.Quantity * Amount …
Run Code Online (Sandbox Code Playgroud)

join sql-server subquery

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