- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个SQL查询需要执行多个内连接,如下:
SELECT DISTINCT adv.Email, adv.Credit, c.credit_id AS creditId, c.creditName AS creditName, a.Ad_id AS adId, a.adName
FROM placementlist pl
INNER JOIN
(SELECT Ad_id, List_id FROM placements) AS p
ON pl.List_id = p.List_id
INNER JOIN
(SELECT Ad_id, Name AS adName, credit_id FROM ad) AS a
ON ...
(few more inner joins)
我的问题如下:如何优化此查询?我的印象是,即使我当前查询数据库的方式创建了小的临时表(内部 SELECT 语句),对未更改的表执行内部连接仍然是有利的,因为它们可能有大约 10,000 - 100,000 个条目(不是数百万)。然而,有人告诉我这不是解决问题的最佳方法,但我没有机会询问推荐的方法是什么。
这里最好的方法是什么?
最佳答案
使用派生表如
INNER JOIN (SELECT Ad_id, List_id FROM placements) AS p
不推荐。让dbms自己找出它需要的值
INNER JOIN placements AS p
而不是(再次)通过强制它在表上创建一个仅包含两个值的 View 来告诉它。 (并且使用 FROM tablename 更具可读性。)
对于 SQL,您主要是说您想看到什么,而不是如何实现。 (好吧,当然这只是一个经验法则。)所以如果除了 Ad_id 和 List_id 之外没有其他列用于表放置,dbms 将找到处理这个问题的最佳方法。不要试图让它以您的方式使用。
IN 子句也是如此,顺便说一下,您经常会看到 WHERE col IN (SELECT DISTINCT colx FROM ...)
而不是简单的 WHERE col IN (SELECT colx 来自 ...)
。这完全相同,但是使用 DISTINCT 告诉 dbms“在查找 col 之前使子查询的行不同”。但是你为什么要强制它这样做呢?为什么不让它只使用 dbms 认为最合适的方法?
回到派生表:当它们真正做某事时使用它们,尤其是聚合,或者当它们使您的查询更具可读性时。
此外,
SELECT DISTINCT adv.Email, adv.Credit, ...
看起来也不太好。是的,有时您需要 SELECT DISTINCT,但通常不需要。大多数情况下,这只是一个迹象,表明您没有仔细考虑您的查询。
例如:您想要选择购买产品 X 的客户。在 SQL 中,您会说:客户购买 X 的情况。或者:客户在 X 购买者的集合中。
select * from clients c where exists
(select * from purchases p where p.clientid = c.clientid and product = 'X');
或者
select * from clients where clientid in
(select clientid from purchases where product = 'X');
您不会说:给我所有客户和 X 次购买的组合,然后将其归结为每个客户一次。
select distinct c.*
from clients c
join purchases p on p.clientid = c.clientid and product = 'X';
是的,连接所有需要的表非常容易,然后列出要选择的列,然后将 DISTINCT 放在前面。但这会使查询有点模糊,因为您不会像编写任务那样编写查询。当涉及到聚合时,它会使事情变得困难。以下查询是错误的,因为您将赚取的钱乘以花钱记录的数量,反之亦然。
select
sum(money_spent.value),
sum(money_earned.value)
from user
join money_spent on money_spent.userid = user.userid
join money_earned on money_earned.userid = user.userid;
以下可能看起来正确,但仍然不正确(它仅在值恰好是唯一的情况下有效):
select
sum(distinct money_spent.value),
sum(distinct money_earned.value)
from user
join money_spent on money_spent.userid = user.userid
join money_earned on money_earned.userid = user.userid;
同样:您不会说:“我想将每次购买与每次收入结合起来,然后……”。你会说:“我想要每个用户花费的金额和赚取的金额”。因此,您处理的不是单笔购买或收入,而是它们的总和。如
select
sum(select value from money_spent where money_spent.userid = user.userid),
sum(select value from money_earned where money_earned.userid = user.userid)
from user;
或者:
select
spent.total,
earned.total
from user
join (select userid, sum(value) as total from money_spent group by userid) spent
on spent.userid = user.userid
join (select userid, sum(value) as total from money_earned group by userid) earned
on earned.userid = user.userid;
所以你看,这就是派生表发挥作用的地方。
关于mysql - 使用许多内部连接构建 SQL 查询的最佳方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26710253/
SQL、PL-SQL 和 T-SQL 之间有什么区别? 谁能解释一下这三者之间的区别,并提供每一个的相关使用场景? 最佳答案 SQL 是一种对集合进行操作的查询语言。 它或多或少是标准化的,几乎所有关
这个问题已经有答案了: What is the difference between SQL, PL-SQL and T-SQL? (6 个回答) 已关闭 9 年前。 我对 SQL 的了解足以完成我的
我在数据库中有一个 USER 表。该表有一个 RegistrationDate 列,该列有一个默认约束为 GETDATE()。 使用 LINQ 时,我没有为 RegistrationDate 列提供任
我有一个可能属于以下类型的字符串 string expected result 15-th-rp 15 15/12-rp 12 15-12-th
很难说出这里问的是什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或言辞激烈,无法以目前的形式合理回答。如需帮助澄清此问题以便可以重新打开,visit the help center . 9年前关闭
我有一个存储过程(称为 sprocGetArticles),它从文章表中返回文章列表。这个存储过程没有任何参数。 用户可以对每篇文章发表评论,我将这些评论存储在由文章 ID 链接的评论表中。 有什么方
我目前正在做一个 *cough*Oracle*cough* 数据库主题。讲师介绍embedded SQL作为让其他语言(例如 C、C++)与(Oracle)数据库交互的方式。 我自己做了一些数据库工作
SQL Server 中 SQL 语句的最大长度是多少?这个长度是否取决于 SQL Server 的版本? 例如,在 DECLARE @SQLStatement NVARCHAR(MAX) = N'S
这个问题已经有答案了: Simple way to transpose columns and rows in SQL? (9 个回答) 已关闭 8 年前。 CallType
预先感谢您对此提供的任何帮助。 假设我有一个查询,可以比较跨年的数据,从某个任意年份开始,永无止境(进入 future ),每年同一时期直到最后一个完整的月份(其特点是一月数据永远不会显示至 2 月
我在数据库中有一个 USER 表。该表有一个 RegistrationDate 列,该列的默认约束为 GETDATE()。 使用 LINQ 时,我没有为 RegistrationDate 列提供任何数
下面是我试图用来检查存储过程是否不存在然后创建过程的 sql。它会抛出一个错误:Incorrect syntax near the keyword 'PROCEDURE' IF NOT EXISTS
我有一个同事声称动态 SQL 在许多情况下比静态 SQL 执行得更快,所以我经常看到 DSQL 到处都是。除了明显的缺点,比如在运行之前无法检测到错误并且更难阅读,这是否准确?当我问他为什么一直使用
来自 lobodava 的动态 SQL 查询是: declare @sql nvarchar(4000) = N';with cteColumnts (ORDINAL_POSITION, CO
使用 SQL Server 中的存储过程执行动态 SQL 命令的现实优点和缺点是什么 EXEC (@SQL) 对比 EXEC SP_EXECUTESQL @SQL ? 最佳答案 sp_executes
我有这个有效的 SQL 查询: select sum(dbos.Points) as Points, dboseasons.Year from dbo.StatLines dbos i
我正在调试一些构建成功运行的 SQL 命令的代码。 然而,在查询结束时,查询结果似乎被写入了一个文本文件。 完整的查询如下 echo SELECT DATE,DATETABLE,DATE,APPDAT
我有一些创建表的 .sql 文件(MS SQL 数据库): 表_1.sql: IF OBJECT_ID (N'my_schema.table1', N'U') IS NOT NULL DROP TAB
我写了下面的 SQL 存储过程,它一直给我错误@pid = SELECT MAX(... 整个过程是: Alter PROCEDURE insert_partyco @pname varchar(20
我在 SQL Server 2005 中有包含两列 Fruit 和 Color 的表,如下所示 Fruit Colour Apple Red Orange
我是一名优秀的程序员,十分优秀!