下面的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)
此外,有人可以说明两者之间的差异
之前已经讨论过这个问题,但是没有一个答案解决了我的具体问题,因为我正在处理内部和外部选择中的不同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)
以下描述了我要解决的情况:
无论如何使用派生表或联接来重写它以获得相同的结果?
更新:我为我的具体问题创建了样本数据和3个解决方案(2个受sgeddes影响).我添加的那个涉及将相关子查询移动到FROM子句中的派生表.谢谢你的帮助!
我有一个通用的问题,我将尝试使用一个例子来解释.
假设我有一个包含字段的表:"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,我没有找到实现此目的的其他方法.
有任何想法吗?
我正在尝试创建一个查询,该查询将返回除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) 问题
我需要更好地理解有关何时可以在子查询中引用外部表以及何时(以及为什么)这是不合适的请求的规则.我在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问题的大量简化版本.假设我有一张世界上所有城市的表格,如下所示:
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大脑只是告诉我,我需要循环结果......
谢谢!
如果过滤条件依赖于外部表和子查询表中的合并列,则 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) 有没有办法让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
我有这个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) 我有两张桌子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 ×9
sql-server ×3
mysql ×2
postgresql ×2
subquery ×2
aggregate ×1
inline-view ×1
null ×1
python ×1
scope ×1
snowflake-cloud-data-platform ×1
sql-update ×1
sqlalchemy ×1