这可能是一个幼稚的问题,但这两个查询有什么区别,哪个是首选?
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) 我的查询是:
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 中,我可以使用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)
我的问题是:如何将联合表保存到另一个表?
我试图向自己证明内部联接的顺序并不重要,但是,从抽象的意义上来说,我什么也没想到。
如何证明一组 INNER JOIN 的执行顺序(将多个表转换为单个表)不会影响结果集(即证明 INNER JOIN 操作的交换性和关联性)?
我正在尝试计算从子查询中检索的列数,并且某些子查询可能为空。因此,我不想将其显示为空单元格,而是希望它为 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应该如何使用?
我一直在到处搜索,但我找不到任何关于它的东西,似乎每个人都只关心 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 会有什么不同吗?
在 Oracle 中,我使用
SELECT * FROM table1...JOIN...
Run Code Online (Sandbox Code Playgroud)
其中点表示连接类型或连接条件。
这是 ANSI 89 语法吗?如果没有,那么如果我使用 ANSI 89,我将如何执行连接?
我正在尝试将以下连接查询作为 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) 我有两张桌子(tblReps和tblDailyWorkingTime)。该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) 我跑了咆哮查询;
询问:
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 ×10
postgresql ×3
sql-server ×3
mysql ×2
subquery ×2
coalesce ×1
explain ×1
mariadb ×1
partitioning ×1
performance ×1
query ×1
relations ×1
sql-standard ×1
sum ×1
t-sql ×1
update ×1