完全外连接产生的关系的键是什么?如果没有key,怎么说关系代数在它的算子下是封闭的,每个算子的结果也是一个关系?
我有两张桌子,products并且subscriptions:
CREATE TABLE products (
id bigint NOT NULL,
title character varying(75),
description text,
manufacturer_id bigint,
created_at timestamp without time zone,
updated_at timestamp without time zone,
mpn text,
visible boolean DEFAULT false NOT NULL
);
CREATE TABLE subscriptions (
id bigint NOT NULL,
product_id bigint NOT NULL,
user_id bigint NOT NULL,
created_at timestamp without time zone,
updated_at timestamp without time zone
);
Run Code Online (Sandbox Code Playgroud)
在我的应用程序中,我通常需要知道某个产品的订阅者数量,而在应用程序中所有正确位置使用此逻辑是很棘手的。所以我想products用已经包含该信息的视图替换该表。所以我这样做了:
ALTER TABLE ONLY products
RENAME TO products_raw;
CREATE VIEW products AS …Run Code Online (Sandbox Code Playgroud) 这个问题是我之前提出的一个过于简化的问题的扩展。更准确的示例在此 SQLFiddle中演示,我演示了一个有效(但速度较慢)的解决方案,然后尝试将先前的答案调整为实际问题。
实际问题是因为这两个表包含多个时间线的事件。
CREATE TABLE foo (ts int, id text, foo text);
INSERT INTO foo (ts, id, foo)
VALUES
(1, 'A', 'Lorem'),
(1, 'B', 'ipsum'),
(4, 'B', 'dolor'),
(5, 'A', 'sit'),
(8, 'A', 'amet'),
(8, 'B', 'consectetur');
CREATE TABLE bar (ts int, id text, bar text);
INSERT INTO bar (ts, id, bar)
VALUES
(1, 'A', 'adipiscing'),
(5, 'B', 'elit'),
(6, 'A', 'sed'),
(9, 'B', 'do ');
Run Code Online (Sandbox Code Playgroud)
每个表都有时间线“A”和“B”的事件。目标是将结果组合成单个结果集,显示每个时间线的“状态”。两条时间线是正交的。
ts id foo 栏 1 Lorem adipiscing …
我有一个表 A,它有一个名为 id 的字段,它是该表的主键。我还有一个名为 B 的表,它还有一个名为 id 的字段作为主键。
现在我想从表 A 中获取所有行,其中 id 值不作为任何表 B id 字段值中的值存在。
我的第一个查询是这样的:
SELECT a.id FROM a WHERE a.id NOT IN (SELECT DISTINCT b.id FROM b)
Run Code Online (Sandbox Code Playgroud)
然后我构建了一个看起来像这样的查询以提高速度:
SELECT a.id FROM a LEFT JOIN b ON a.id = b.id WHERE b.id IS NULL
Run Code Online (Sandbox Code Playgroud)
现在我在表 A 中得到 600k 行,在表 B 中得到 400k 行,并且事情变得非常缓慢。有没有更好的查询来运行这种操作,或者有没有更好的方法来解决这个问题?任何提示或指示?
我正在尝试LEFT JOIN使用数组unnest()函数实现类似的功能。如果数组为空,我希望查询返回具有空值的行。因此,通过使用CASE构造,如果源数组为空,我想传递具有单个空元素的假数组,但它无法按预期工作:
查询 1
select element
from (
select array['a']::text[] as arr --< single non-null element
) sub, unnest(
(
case when array_length(sub.arr, 1) <= 0 then (array[null])::text[]
else sub.arr
end
)
) element
-- returns 1 row with element = "a"
Run Code Online (Sandbox Code Playgroud)
查询 2
select element
from (
select array[]::text[] as arr --< empty array
) sub, unnest(
(
case when array_length(sub.arr, 1) <= 0 then (array[null])::text[]
else sub.arr
end
)
) element
-- …Run Code Online (Sandbox Code Playgroud) 我有一个非常古老的 Access 应用程序,它使用 SQL Pass-Through 查询。此应用程序经过多次服务器升级,我们最近升级到 SQL 2012。
我现在收到一个语法错误。代码的最后两行就是问题所在。我相信这是某种 JOIN,但我从未见过这种语法。删除“*”允许查询运行,但会遗漏数据。是否可以轻松替换此语法,或者我是否需要使用 JOIN 短语重新设计这些查询?
SELECT survey.hole,survey_date,pit,cu,rec,zn, mn,north,east,elevation,
rtrim(min_type) min_type,rtrim(rock_type) rock_type,
rtrim(alt_type) alt_type, rtrim(min_style) min_style
FROM survey,assay,geology
WHERE mined_out IS NULL
AND pit = (SELECT fmpit FROM tyrctl WHERE source = 'export by date')
AND (survey_date >= (SELECT fmdate FROM tyrctl WHERE source = 'export by date')
AND survey_date <= (SELECT todate FROM tyrctl WHERE source = 'export by date'))
AND survey.hole *= assay.hole
AND survey.hole *= geology.hole
Run Code Online (Sandbox Code Playgroud) 当我使用 LEFT JOIN 查询时
SELECT employees.eno,employees.name,employees.dept,attendanceIn.attIn FROM `employees`
LEFT JOIN attendanceIn ON employees.eno = attendanceIn.eno
WHERE date(attIn) like '2016-07-02%'
Run Code Online (Sandbox Code Playgroud)
我得到的是,
我有两个表 - 一个标题为“计划约束”的表,其中包含“sot_allowed”时间间隔,另一个标题为“计划”,其中包含“sot_contribution”时间间隔。
以下是两个表的架构(为便于阅读而进行了编辑):
Table "public.planning_constraints"
Column | Type | Modifiers
-------------+--------------------------+-------------------------------
start_time | timestamp with time zone |
end_time | timestamp with time zone |
sot_allowed | interval |
Table "public.planning"
Column | Type | Modifiers
------------------+--------------------------+----------------------------
start_time | timestamp with time zone |
end_time | timestamp with time zone |
sot_contribution | interval |
Run Code Online (Sandbox Code Playgroud)
我可以分别查询它们并生成我想要的总数。“planning_constraints”表的查询是:
SELECT
date_trunc('day', start_time - INTERVAL '18 hours')::date AS planning_day,
sum(sot_allowed) AS minutes_allowed
FROM planning_constraints
WHERE start_time>='2016-11-26 18:00:00+00' AND start_time<'2016-12-03 18:00:00+00' AND comment like …Run Code Online (Sandbox Code Playgroud) 我对 SQL 查询调优相当陌生。我一直在尝试了解如何编写等效的查询。在浏览J. Widom 教授的斯坦福在线视频讲座时,她提到了一些子查询,如果不JOIN使用DISTINCT. 例如,看这个:
4:45 / 20:13 - GPA 示例
SELECT GPA
FROM Student
WHERE sID in (select sID from Apply where major = 'CS');
Run Code Online (Sandbox Code Playgroud)6:39 / 20:13 - 学生申请 CS 而不是 EE
SELECT sID, sName
FROM Student
WHERE sID IN (select sID from Apply where major = 'CS')
AND sID NOT IN (select sID from Apply where major = 'EE');
Run Code Online (Sandbox Code Playgroud)我的问题是如何知道使用子查询编写的 SQL 语句是否将具有使用连接编写的等效语句。我很舒服,如果在答案中,有人喜欢使用关系代数表示法。
我在网上搜索了很多,找不到合适的答案。
Schema 和表创建(对于 PostgreSQL)如下,
CREATE TEMP TABLE college …Run Code Online (Sandbox Code Playgroud) 下面的查询非常慢(运行超过一分钟),我已将问题缩小到OR操作员 ( ...OR (EXISTS (SELECT...)。
我使用实时执行来验证 OR 语句的表之间是否存在嵌套循环连接,然后将记录连接回EmailTable执行计划中的 。
基本上,EmailTable正在被探查两次。
如果我添加提示OPTION (MERGE JOIN),查询将在一秒钟内完成。
请告诉我如何重写此查询,以便优化器默认选择更好的计划。
EmailTable并且TeamMembers在 上有聚集索引INS_ID。表上的统计数据经常更新。
DECLARE @a INT
,@b BIT
,@c INT
,@d INT
,@e INT;
SELECT [XYZ].[CNT] AS [C]
FROM (
SELECT COUNT(1) AS [CNT]
FROM [dbo].[EmailTable] AS [table1]
WHERE ([table1].[INS_ID] = @a)
AND ([table1].[ACTIVE] = 1)
AND ([table1].[QUEUED_TO_SEND] = @b)
AND ([table1].[OWNER_USER_ID] <> @c)
AND (
([table1].[OWNER_USER_ID] IN (- 1))
OR (N'Allusers' = …Run Code Online (Sandbox Code Playgroud) performance join sql-server optimization exists query-performance
join ×10
postgresql ×4
mysql ×2
performance ×2
sql-server ×2
array ×1
coalesce ×1
datetime ×1
exists ×1
ms-access ×1
optimization ×1
select ×1
subquery ×1
sum ×1
update ×1
view ×1