标签: correlated-subquery

子查询与相关子查询之间的区别

下面的SQL查询是普通查询还是相关子查询?

SELECT UserID,
       FirstName,
       LastName,
       DOB,
       GFName,
       GLName,
       LoginName,
       LoginEffectiveDate,
       LoginExpiryDate,
       Password,
       Email,
       ReportingTo,
       Mobile,
       CommunicationPreference,
       IsActive
FROM   (SELECT row_number() OVER (ORDER BY FirstName) AS Row,
               UserID,
               FirstName,
               LastName,
               DOB,
               GFName,
               GLName,
               LoginName,
               LoginEffectiveDate,
               LoginExpiryDate,
               Password,
               Email,
               ReportingTo,
               Mobile,
               CommunicationPreference,
               IsActive
        FROM   DivakarUserRegistration)  T
Run Code Online (Sandbox Code Playgroud)

此外,有人可以说明两者之间的差异

sql sql-server subquery correlated-subquery

43
推荐指数
4
解决办法
27万
查看次数

SQL Server"无法对包含聚合或子查询的表达式执行聚合函数",但Sybase可以

之前已经讨论过这个问题,但是没有一个答案解决了我的具体问题,因为我正在处理内部和外部选择中的不同where子句.此查询在Sybase下执行得很好,但在SQL Server下执行时会在此帖子的标题中给出错误.查询很复杂,但查询的一般大纲是:

select sum ( t.graduates -
    ( select sum ( t1.graduates )
      from table as t1
      where t1.id = t.id and t1.group_code not in ('total', 'others' ) ) )
from table as t
where t.group_code = 'total'
Run Code Online (Sandbox Code Playgroud)

以下描述了我要解决的情况:

  • 除"总计"和"其他"外,所有组代码均代表比赛
  • 组代码'total'代表所有种族的毕业生总数
  • 然而,多种族缺失,因此种族毕业生数量可能不等于毕业总数
  • 这个缺失的数据是需要计算的

无论如何使用派生表或联接来重写它以获得相同的结果?

更新:为我的具体问题创建了样本数据和3个解决方案(2个受sgeddes影响).我添加的那个涉及将相关子查询移动到FROM子句中的派生表.谢谢你的帮助!

sql sql-server aggregate correlated-subquery

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

MySQL/SQL:使用更新表本身的相关子查询进行更新

我有一个通用的问题,我将尝试使用一个例子来解释.

假设我有一个包含字段的表:"id","name","category","appearances"和"ratio"

我的想法是,我有几个项目,每个项目都与一个类别有关并且多次"出现".比率字段应包括每个项目出现的百分比,超出该类别中项目的总出现次数.

在伪代码中我需要的是以下内容:

  • 对于每个类别,
    查找与其相关的项目的外观总和.例如,它可以用(select sum("appearances") from table group by category)完成

  • 对于每个项目,
    将比率值设置为项目的外观除以上面类别的总和

现在,我正在尝试使用单个更新查询来实现此目的,但似乎无法做到这一点.我认为我应该做的是:

update Table T    
set T.ratio = T.appearances /   
(    
select sum(S.appearances)    
from Table S    
where S.id = T.id    
)
Run Code Online (Sandbox Code Playgroud)

但MySQL不接受更新列中的别名T,我没有找到实现此目的的其他方法.

有任何想法吗?

mysql sql correlated-subquery sql-update

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

在任意列中查找具有空值的所有行

我正在尝试创建一个查询,该查询将返回除1列之外的所有具有空值的行.某些行在某处会有多个空条目.我想要排除一列,因为此时所有条目都为空,并且它是唯一允许具有空值的列.我被困了,因为我不知道如何在WHERE中包含所有列.

SELECT *
FROM Analytics
WHERE * IS NULL
Run Code Online (Sandbox Code Playgroud)

或者,我可以对一列进行计数,但该表有大约67列.

SELECT COUNT(*)
FROM Analytics
WHERE P_Id IS NULL
Run Code Online (Sandbox Code Playgroud)

sql sql-server null sql-server-2005 correlated-subquery

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

SQL - SubQuery和外表之间的关系

问题

我需要更好地理解有关何时可以在子查询中引用外部表以及何时(以及为什么)这是不合适的请求的规则.我在Oracle SQL查询中发现了一个重复,我正在尝试重构,但是当我尝试将我的引用表转换为分组子查询时,我遇到了问题.

以下声明适用:

SELECT  t1.*  
FROM    table1 t1, 
INNER JOIN table2 t2 
        on t1.id = t2.id        
        and t2.date = (SELECT max(date) 
                       FROM   table2  
                       WHERE  id = t1.id) --This subquery has access to t1
Run Code Online (Sandbox Code Playgroud)

不幸的是,table2有时会有重复的记录,所以在将它加入t1之前我需要首先聚合t2.但是,当我尝试将其包装在子查询中以完成此操作时,SQL引擎突然无法再识别外部表.

SELECT  t1.* 
FROM    table1 t1, 
INNER JOIN (SELECT * 
            FROM  table2 t2
            WHERE t1.id = t2.id              --This loses access to t1
              and t2.date = (SELECT max(date) 
                             FROM   table2 
                             WHERE  id = t1.id)) sub on t1.id = sub.id 
                             --Subquery loses access to t1
Run Code Online (Sandbox Code Playgroud)

我知道这些是根本不同的查询,我要求编译器放在一起,但我不知道为什么一个会工作而不是另一个.

我知道我可以复制子查询中的表引用,并有效地将子查询从外部表中分离,但这似乎是完成此任务的一种非常难看的方式(所有代码和处理的重复都是如此).

有用的参考资料 …

sql subquery derived-table correlated-subquery inline-view

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

在PostgreSQL中选择带有count的不同值

这是我正在处理的SQL问题的大量简化版本.假设我有一张世界上所有城市的表格,如下所示:

country city
------------
Canada  Montreal
Cuba    Havanna
China   Beijing
Canada  Victoria
China   Macau
Run Code Online (Sandbox Code Playgroud)

我想算一下每个国家有多少个城市,这样我最终会得到一张桌子:

country city_count
------------------
Canada  50
Cuba    10
China   200
Run Code Online (Sandbox Code Playgroud)

我知道我可以获得不同的国家/地区值,SELECT distinct country FROM T1我怀疑我需要为city_count列构建子查询.但我的非SQL大脑只是告诉我,我需要循环结果......

谢谢!

sql correlated-subquery postgresql-9.1

10
推荐指数
1
解决办法
6919
查看次数

这是一个错误,还是 Snowflake 不完全支持 WHERE EXISTS 子句中的相关子查询?

如果过滤条件依赖于外部表和子查询表中的合并列,则 Snowflake 会针对 EXISTS 子句引发错误。如果我从 COALESCE 中删除外部表列或将 COALESCE 替换为长格式等效逻辑,则查询将运行。

我看到这个错误,特别是SQL 编译错误: Unsupported subquery type cannot bevaluated,我认为这是一个相当简单的 WHERE EXISTS 子句。这适用于我使用过的每个(最近的)SQL 变体(例如 SQL Server、Postgres),所以我有点担心 Snowflake 不支持它。我错过了什么吗?

我在 2019 年的Snowflake 社区中发现了一个类似的问题,当 EXISTS 子句包含一个 WHERE 过滤条件,该条件引用外部查询中的列以进行连接表以外的操作时,Snowflake 会失败。那里没有明确的解决方案。

Snowflake关于其对子查询的有限支持的文档表示,它支持“WHERE 子句中的 EXISTS、ANY / ALL 和 IN 子查询”的相关和不相关子查询。

那么为什么 EXISTS 子句会失败呢?我看到的是一个错误,还是这是一个没有明确记录的 Snowflake 限制?

重现问题的代码:

CREATE OR REPLACE TEMPORARY TABLE Employee (
   Emp_SK INT NOT NULL
);

CREATE OR REPLACE TEMPORARY TABLE Employee_X_Pay_Rate (
   Emp_SK INT NOT NULL, Pay_Rate_SK INT NOT NULL, Start_Date …
Run Code Online (Sandbox Code Playgroud)

sql correlated-subquery snowflake-cloud-data-platform

10
推荐指数
1
解决办法
4825
查看次数

使用SQLAlchemy在select语句中使用子查询作为列生成sql

有没有办法让SQLAlchemy生成一个自定义列的查询,该列是与当前行相关的子查询:

SELECT
 tab1.id,
 tab1.col1, 
 ...,
 (
     SELECT count(1) FROM tab2 
     WHERE tab2.tab1_id = tab1.id
     GROUP BY tab2.col1
 ) as cnt
FROM tab1
WHERE ...
LIMIT 100
Run Code Online (Sandbox Code Playgroud)

使用ORM API?

session.query(Tab1, ?(subquery for additional column)?).filter(...).limit(100)
Run Code Online (Sandbox Code Playgroud)

我正在使用PostgreSQL 9.3和旧版本的SQLAlchemy 0.9.8

python postgresql sqlalchemy correlated-subquery

9
推荐指数
1
解决办法
5517
查看次数

相关子查询的MySql范围问题

我有这个Mysql查询,它的工作原理:

SELECT 
    nom
    ,prenom
    ,(SELECT GROUP_CONCAT(category_en) FROM
            (SELECT DISTINCT category_en FROM categories c WHERE id IN
                (SELECT DISTINCT category_id FROM m3allems_to_categories m2c WHERE m3allem_id = 37)
            ) cS
      ) categories
    ,(SELECT GROUP_CONCAT(area_en) FROM 
            (SELECT DISTINCT  area_en FROM areas c WHERE id IN 
                (SELECT DISTINCT area_id FROM m3allems_to_areas m2a WHERE m3allem_id = 37)
            ) aSq
     ) areas
FROM m3allems m
WHERE m.id = 37     
Run Code Online (Sandbox Code Playgroud)

结果是:

nom             prenom      categories              areas
Man             Multi       Carpentry,Paint,Walls   Beirut,Baalbak,Saida
Run Code Online (Sandbox Code Playgroud)

它工作正确,但只有当我将查询硬编码到我想要的ID时(37).我希望它适用于m3allem表中的所有条目,所以我试试这个:

SELECT 
    nom
    ,prenom
    ,(SELECT GROUP_CONCAT(category_en) FROM
            (SELECT …
Run Code Online (Sandbox Code Playgroud)

mysql sql scope correlated-subquery

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

在postgresql中的子查询中使用外部查询结果

我有两张桌子points,contacts而且我试图points.score按月分组每个联系人的平均值. 请注意,积分和联系人不相关,我只想要在一个月内创建的积分总和除以该月份存在的联系人数量.

所以,我需要总结按created_at月份分组的点数,我需要只计算那个月份的联系人数量.这是最后一部分让我烦恼的部分.我不确定如何在子查询中使用外部查询中的列.我试过这样的事情:

SELECT SUM(score) AS points_sum,
  EXTRACT(month FROM created_at) AS month,
  date_trunc('MONTH', created_at) + INTERVAL '1 month' AS next_month,
  (SELECT COUNT(id) FROM contacts WHERE contacts.created_at <= next_month) as contact_count
FROM points
GROUP BY month, next_month
ORDER BY month
Run Code Online (Sandbox Code Playgroud)

所以,我正在提取我的积分总和的实际月份,同时,得到next_month的开头,这样我就可以说"让我知道他们创建的联系人的数量是<next_month"

但它抱怨说column next_month doesn't exist 这是可以理解的,因为子查询对外部查询一无所知.资格赛points.next_month也不起作用.

那么有人能指出我如何实现这一目标的正确方向吗?

表:

score | created_at
10    | "2011-11-15 21:44:00.363423"
11    | "2011-10-15 21:44:00.69667" 
12    | "2011-09-15 21:44:00.773289"
13    | "2011-08-15 21:44:00.848838"
14    | "2011-07-15 …
Run Code Online (Sandbox Code Playgroud)

sql postgresql correlated-subquery

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