标签: join

按另一个表的 COUNT 更新列

这可能是一个幼稚的问题,但这两个查询有什么区别,哪个是首选?

UPDATE table1, 
(SELECT id,COUNT(*) idcount FROM table2 GROUP BY id) AS B 
SET table1.Freq = B.idcount WHERE table1.id=B.id
Run Code Online (Sandbox Code Playgroud)

UPDATE table1 A INNER JOIN 
(SELECT id,COUNT(*) idcount FROM table2 GROUP BY id) B USING (id) 
SET A.Freq = B.idcount
Run Code Online (Sandbox Code Playgroud)

mysql performance join subquery update query-performance

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

如何防止 PostgreSQL 重写 OUTER JOIN 查询?

我的查询是:

SELECT  Acol1, Acol2, Bcol1, Bcol2, Ccol1, Ccol2
FROM    tableA LEFT JOIN
            (tableB FULL JOIN tableC ON (Bcol1 = Ccol1))
            ON (Acol1 = Bcol1)
Run Code Online (Sandbox Code Playgroud)

EXPLAIN ANALYZE给我:

                                                      QUERY PLAN                                                      
----------------------------------------------------------------------------------------------------------------------
 Hash Right Join  (cost=99.65..180.45 rows=1770 width=24) (actual time=0.043..0.103 rows=3 loops=1)
   Hash Cond: (tableb.bcol1 = tablea.acol1)
   ->  Hash Left Join  (cost=49.83..104.08 rows=1770 width=16) (actual time=0.011..0.062 rows=3 loops=1)
         Hash Cond: (tableb.bcol1 = tablec.ccol1)
         ->  Seq Scan on tableb  (cost=0.00..27.70 rows=1770 width=8) (actual time=0.001..0.002 rows=3 loops=1)
         ->  Hash  (cost=27.70..27.70 rows=1770 width=8) (actual time=0.004..0.004 …
Run Code Online (Sandbox Code Playgroud)

postgresql join execution-plan explain

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

如何将连接结果保存到另一个表?

在 PostgreSQL 中,我可以使用SELECT INTOSELECT将结果保存到另一个表:

SELECT id INTO new_record_ids FROM new_table
  EXCEPT
    SELECT id FROM old_table
ORDER BY id;
Run Code Online (Sandbox Code Playgroud)

然而,这不适用于连接:

-- doesn't work:
SELECT * INTO new_records FROM new_table
  JOIN new_record_ids ON new_record_ids.id = new_table.id
ORDER BY new_table.id;
Run Code Online (Sandbox Code Playgroud)

连接本身是正确的:

-- works:
SELECT * FROM new_table
  JOIN new_record_ids ON new_record_ids.id = new_table.id
ORDER BY new_table.id;
Run Code Online (Sandbox Code Playgroud)

我的问题是:如何将联合表保存到另一个表?

postgresql join

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

内连接可交换的证明

我试图向自己证明内部联接的顺序并不重要,但是,从抽象的意义上来说,我什么也没想到。

如何证明一组 INNER JOIN 的执行顺序(将多个表转换为单个表)不会影响结果集(即证明 INNER JOIN 操作的交换性和关联性)?

join relational-theory relations relational-algebra

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

为什么 COALESCE 函数对此查询不起作用?

我正在尝试计算从子查询中检索的列数,并且某些子查询可能为空。因此,我不想将其显示为空单元格,而是希望它为 0。发现我可以通过使用该COALESCE函数来做到这一点,但例如此查询仍然给我一个空单元格:

CREATE VIEW third_table AS 
SELECT * 
FROM  (second_table  
NATURAL FULL JOIN (
   SELECT assignment_id, COALESCE( count(*), 0 ) AS num_60_79 
   FROM (
      SELECT assignment_id, mark_as_percent 
      FROM avg_required_table
      WHERE mark_as_percent >= 60 
      AND mark_as_percent < 80
      ) a 
   GROUP BY assignment_id
   ) b);
Run Code Online (Sandbox Code Playgroud)

这是COALESCE应该如何使用?

postgresql join subquery coalesce

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

JOIN 短路

我一直在到处搜索,但我找不到任何关于它的东西,似乎每个人都只关心 WHERE 和 CASE。(而且我手头没有 SQL Server 来亲自验证它)

那么,一个简单的问题:SQL Server 是否基于 JOIN 条件短路 JOIN?如果我写:

TableA LEFT OUTER JOIN TableB ON 1=0 AND TableA.ID = TableB.A_ID
Run Code Online (Sandbox Code Playgroud)

SQL Server 会跳过连接吗?


编辑

好的,有人正确地指出这是在编译时解决的,所以我最好扩展一下这个问题。

以上只是作为一个例子,但结果证明这是一个糟糕的例子。我想知道的是,当这种情况在运行时发生时,SQL Server 是否会短路 JOIN,作为传递给存储过程的 @parameter 的结果。

我问是因为我肯定在过去几年中使用过类似的东西,但我想在与一些同事谈论它之前 100% 确定。那么,SQL Server 是否会将其短路,然后:

TableA LEFT OUTER JOIN TableB ON @parameter IS NOT NULL AND TableA.ID = TableB.A_ID
Run Code Online (Sandbox Code Playgroud)

如果它在 SP 内并且在 @parameter 设置为 NULL 的情况下调用它?如果存储过程是 WITH RECOMPILE 会有什么不同吗?

join sql-server t-sql

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

如何在 ANSI SQL 89 语法中执行 JOIN?

在 Oracle 中,我使用

SELECT * FROM table1...JOIN...
Run Code Online (Sandbox Code Playgroud)

其中点表示连接类型或连接条件。

这是 ANSI 89 语法吗?如果没有,那么如果我使用 ANSI 89,我将如何执行连接?

join sql-standard

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

我可以通过分区或合并来加速大型 MySQL/MariaDB 连接吗?

我正在尝试将以下连接查询作为 MariaDB 10.1.26 上更复杂查询的一部分运行。

select distinct
    project_commits.project_id,
    date_format(created_at, '%x%v1') as week_commit
    from project_commits
    left join commits
    on project_commits.commit_id = commits.id;
Run Code Online (Sandbox Code Playgroud)

两个连接字段都被索引。但是,连接涉及对 的完整扫描project_commits和索引查找commits。的输出证实了这一点EXPLAIN

+------+-------------+-----------------+--------+---------------+---------+---------+-------------------------------------+------------+-----------------+
| id   | select_type | table           | type   | possible_keys | key     | key_len | ref                                 | rows       | Extra           |
+------+-------------+-----------------+--------+---------------+---------+---------+-------------------------------------+------------+-----------------+
|    1 | SIMPLE      | project_commits | ALL    | NULL          | NULL    | NULL    | NULL                                | 5417294109 | Using temporary |
|    1 | SIMPLE      | commits         | …
Run Code Online (Sandbox Code Playgroud)

mysql mariadb join partitioning

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

JOIN 获取第一个表中的所有行以及第二个表中的 NULL

我有两张桌子(tblRepstblDailyWorkingTime)。该tblReps表,即第一个,返回 37 行,但是当我将它与第二个表连接时,我得到 36 行,因为第二个表只有 36 行与第一个表匹配。

如何使用不匹配的行的 NULL 结果返回 37 行?

这是我到目前为止的查询:

SELECT 
    tblReps.[sName] AS 'RepName',
    tblReps.sNote AS 'Type',
    RIGHT(CAST(tblDaily.sDateAndTimeStart  AS smalldatetime), 8) AS 'DayStarted'

FROM 
    [tblRepresentatives] AS tblReps

FULL OUTER JOIN 
    tblDailyWorkingTime AS tblDaily ON tblDaily.sRepresentativeCode = tblReps.sCode 

WHERE 
    tblDaily.sDate = CAST(GETDATE() AS DATE)
    AND tblReps.[sActive] = 'True'
Run Code Online (Sandbox Code Playgroud)

join sql-server

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

如何使用JOIN和SUM函数计算查询返回列的总数?

我跑了咆哮查询;

询问:

SELECT  j.jobId,
        j.productId,
        p.productUnitPrice
FROM    JobRequiredProducts J
JOIN    Product p
  ON    p.productId = j.productId
WHERE   j.jobId = 1
ORDER BY j.jobId
Run Code Online (Sandbox Code Playgroud)

并得到了以下结果;

查询结果:

jobId | productId | unitPrice 
_____________________________
  1   |     4     |   175.99
  1   |     5     |   100.00
  1   |     6     |   125.00
Run Code Online (Sandbox Code Playgroud)

现在,我想计算所有 unitPrice 以获得总数。我期望的结果是;

期待结果:

jobId | productId | Total
____________________________
  1   |     4     |   175.99
  1   |     5     |   100.00
  1   |     6     |   125.00
 null |    null   |   400.99
Run Code Online (Sandbox Code Playgroud)

因此,下面是我尝试过的查询;

我试过的查询:

SELECT  j.jobId, …
Run Code Online (Sandbox Code Playgroud)

join sql-server query sum

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