标签: join

完全外连接产生的关系的键

完全外连接产生的关系的键是什么?如果没有key,怎么说关系代数在它的算子下是封闭的,每个算子的结果也是一个关系?

join relational-theory

5
推荐指数
1
解决办法
142
查看次数

如何使执行连接的 Postgres 视图可更新?

我有两张桌子,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)

postgresql join view update

5
推荐指数
1
解决办法
3121
查看次数

将多个时间线的两个事件表合并为一个结果集

这个问题是我之前提出的一个过于简化的问题的扩展。更准确的示例在此 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 …

postgresql join window-functions

5
推荐指数
1
解决办法
948
查看次数

“NOT IN”的快速替代方案

我有一个表 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 行,并且事情变得非常缓慢。有没有更好的查询来运行这种操作,或者有没有更好的方法来解决这个问题?任何提示或指示?

mysql performance join select query-performance

5
推荐指数
1
解决办法
2340
查看次数

unnest() 如何处理 NULL 值和空数组?

我正在尝试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)

postgresql join array postgresql-9.4

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

这个运算符是什么意思:*=

我有一个非常古老的 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)

join ms-access sql-server

5
推荐指数
1
解决办法
1583
查看次数

MySQL:LEFT JOIN 未按预期工作

我有 2 个表:员工,出勤率 在此处输入图片说明

当我使用 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)

我得到的是,

实际结果

  • 我的查询有什么问题?
  • 我如何得到我的预期结果?

mysql join

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

如何在相邻列中显示单独表的查询?

我有两个表 - 一个标题为“计划约束”的表,其中包含“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)

postgresql join datetime sum coalesce

5
推荐指数
1
解决办法
108
查看次数

如何在不使用 DISTINCT 的情况下识别无法重写为 JOIN 的相关子查询?

我对 SQL 查询调优相当陌生。我一直在尝试了解如何编写等效的查询。在浏览J. Widom 教授的斯坦福在线视频讲座时,她提到了一些子查询,如果不JOIN使用DISTINCT. 例如,看这个:

  1. 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)
  2. 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)

join subquery

5
推荐指数
1
解决办法
621
查看次数

SQL Server OR 运算符导致大量循环连接

下面的查询非常慢(运行超过一分钟),我已将问题缩小到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

5
推荐指数
1
解决办法
380
查看次数