- 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/
这是我的测试用例。 http://tobeythorn.com/isi/dummy2.svg http://tobeythorn.com/isi/isitest.html 如果我自己打开 svg,内部
这是我的测试用例。 http://tobeythorn.com/isi/dummy2.svg http://tobeythorn.com/isi/isitest.html 如果我自己打开 svg,内部
我正在尝试做类似的事情: SELECT SUM( CASE WHEN ( AND EXISTS(SELECT 1
我想问如何在外部 ng-repeat 内部正确使用内部 ng-repeat: 这意味着你想使用这样的东西: {{milestone.id}} {{
我希望在 wordpress 的仪表板内编辑 css 样式并且如果可能的话不必编辑 php 文件。 我知道至少可以编辑一些属性,所以我希望我可以直接在仪表板中编辑所有属性。 更具体地说如何更改自定义类
我在安装在 windows10 上的 vmware 中的 Ubuntu 上安装了伪分布式独立 hadoop 版本。 我从网上下载了一个文件,复制到ubuntu本地目录/lab/data 我在 ubun
我有一个如下所示的 WHERE 语句: WHERE ((@Value1 IS NULL AND [value1_id] IS NULL) OR [value1_id] = ISNULL(@Va
我有一个如下所示的 WHERE 语句: WHERE ((@Value1 IS NULL AND [value1_id] IS NULL) OR [value1_id] = ISNULL(@Va
在我的一些测试帮助程序代码中,我有一个名为 FakeDbSet(Of T) 的 IDbSet(Of T) 实现,它模拟了许多 EF 行为,但没有实际的数据库。我将类声明为 Friend ,因为我想强制
我正在寻找 Cassandra/CQL 的常见 SQL 习语 INSERT INTO ... SELECT ... FROM ... 的表亲。并且一直无法找到任何以编程方式或在 CQL 中执行此类操作
如何防止内部 while 循环无限运行?问题是,如果没有外部 while 循环,内部循环将毫无问题地运行。我知道它必须对外循环执行某些操作,但我无法弄清楚是什么导致了问题。 import java.u
我正在努力学习更多有关 C++ 的知识,但在国际象棋程序中遇到了一些代码,需要帮助才能理解。我有一个 union ,例如: union b_union { Bitboard b; st
这是我项目网页中的代码片段。这里我想显示用户选择的类别,然后想显示属于该类别的主题。在那里,用户可以拥有多个类别,这没有问题。我可以在第一个 while 循环中打印所有这些类别。问题是当我尝试打印主题
我想知道如何在 swing 中显示内部框架。这意味着,当需要 JFrame 时,通常我所做的是, new MyJFrame().setVisible(true); 假设之前的表单也应该显示。当显示这个
我最近发现了一些有趣的行为,这让我想知道对象如何知道存在哪些全局变量。例如,假设我有一个文件“test.py”: globalVar = 1 toDelete = 2 class Test(objec
我知道它已经在这里得到回答: google maps drag and drop objects into google maps from outside the Map ,但这并不完全是我所需要的
我目前正在学习Javascript DOM和innerHTML,发现在理解innerHTML方面存在一些问题。 这是我的代码:http://jsfiddle.net/hphchan/bfjx1w70/
我构建了一个布局如下的库: lib/ private_class_impl.cc private_class_decl.h public_class_impl.cc include/
我有一个使用 bootstrap 3 的组合 wordpress 网站。它基本上是一个图像网格。当屏幕展开时,它会从三列变为四列。移动时它是一列。 我想出了如何调整图像的顶部和底部边距,但我希望图像的
我正在试用 MSP-EXP430G2 的教程程序,使用 Code Composer Studio 使 LED 闪烁。最初,它有一个闪烁的无限循环: for(;;) // This emp
我是一名优秀的程序员,十分优秀!