Questions tagged «join»

SQL连接子句将来自两个或多个表或视图的记录组合在一起。

2
为什么嵌套循环联接仅支持左联接?
在Craig Freedman的博客Nested Loops Join中,他解释了为什么嵌套循环联接不能支持正确的外部联接: 问题在于,我们多次扫描内部表–对外部联接的每一行扫描一次。在这些多次扫描中,我们可能多次遇到相同的内部行。在什么时候我们可以得出结论,特定的内部行尚未或将不会加入? 有人可以用一种非常简单且具有教育意义的方式来解释这一点吗? 这是否意味着循环从外部表(R1)开始并扫描内部表(R2)? 我了解,对于R1不与相连的值,R2应将其替换为,NULL这样结果集将变为(NULL, R2)。对我来说,似乎无法返回不加入R2时返回值R1,因为它不知道R2要返回哪个值。但这不是它的解释方式。还是? SQL Server会在事实上优化(经常替换)RIGHT JOIN用LEFT JOIN,但问题是解释为什么它在技术上是不可能的NESTED LOOPS JOIN使用/支持RIGHT JOIN逻辑。

2
MySQL连接到另一个表时不使用索引
我有两个表,第一个表包含CMS中的所有文章/博客文章。其中一些文章也可能出现在杂志上,在这种情况下,它们与另一个包含杂志特定信息的表具有外键关系。 这是这两个表的创建表语法的简化版本,其中删除了一些不必要的行: CREATE TABLE `base_article` ( `id` int(11) NOT NULL AUTO_INCREMENT, `date_published` datetime DEFAULT NULL, `title` varchar(255) NOT NULL, `description` text, `content` longtext, `is_published` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`id`), KEY `base_article_date_published` (`date_published`), KEY `base_article_is_published` (`is_published`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; CREATE TABLE `mag_article` ( `basearticle_ptr_id` int(11) NOT NULL, …

2
如何减少行估计以减少溢出到tempdb的机会
我注意到,当tempdb事件大量溢出(导致查询缓慢)时,对于特定的联接,行估计常常会偏离。我已经看到溢出事件是通过合并和哈希联接发生的,它们通常会将运行时间增加3倍至10倍。这个问题涉及如何在减少溢漏事件机会的假设下改进行估计。 实际行数40k。 对于此查询,计划显示错误的行估计(11.3行): select Value from Oav.ValueArray where ObjectId = (select convert(bigint, Value) NodeId from Oav.ValueArray where PropertyId = 3331 and ObjectId = 3540233 and Sequence = 2) and PropertyId = 2840 option (recompile); 对于此查询,该计划显示了良好的行估计(56k行): declare @a bigint = (select convert(bigint, Value) NodeId from Oav.ValueArray where PropertyId = 3331 and …

5
完全外部加入MS Access
我有两个工作人员名单: List A: StaffID Supervisor ==================== 0001234 NULL 0001235 0001234 0001237 0001234 0001239 0001237 和 List B: StaffID Supervisor ==================== 0001234 NULL 0001235 0001234 0001238 0001235 0001239 0001235 我需要以下输出: StaffID SupervisorA SupervisorB =================================== 0001234 NULL NULL 0001235 0001234 0001234 0001237 0001234 NULL 0001238 NULL 0001235 0001239 0001237 0001235 请注意,列表A和列表B中的员工ID已合并到一个非重复列表中,并且我已经合并了两个主管明细,这两个列表之间可能不匹配。 查询不必很好。每个列表中都有大约8000条记录,我会很好地运行它。如有必要,我很乐意在以后进行一些小的Excel操作。 …
11 query  join  ms-access 


2
用来自另一个表的数据更新列
我正在研究复杂的问题,但是我将简化为这个问题。 我有两张桌子 A [ID, column1, column2, column3] B [ID, column1, column2, column3, column4] 我想更新第三个: C [ID, column1, column2,column3] 我正在使用此查询更新另一个第三张表。 UPDATE C set column1=t.firstTab, column2=t.secondTab, column3=t.thirdTab from (select A.column1 as firstTab, B.column2 as secTab, (A.column1 + B.column2) thirdTab from A, B limit 1; ) as t ; 我有: UPDATE 0 当我运行此查询时: …

1
使用Join和Window函数获取超前和滞后值之间的性能比较
我有20M行的表,每一行有3列:time,id,和value。对于每个id和time,value状态为。我想知道的超前滞后一定的值,time为特定的id。 我使用了两种方法来实现此目的。一种方法是使用连接,另一种方法是使用窗口函数超前/滞后以及在time和上的聚集索引id。 我按执行时间比较了这两种方法的性能。join方法需要16.3秒,而window函数方法需要20秒,这不包括创建索引的时间。这使我感到惊讶,因为在join方法是蛮力的情况下,窗口功能似乎已被改进。 这是这两种方法的代码: 创建索引 create clustered index id_time on tab1 (id,time) 加盟方法 select a1.id,a1.time a1.value as value, b1.value as value_lag, c1.value as value_lead into tab2 from tab1 a1 left join tab1 b1 on a1.id = b1.id and a1.time-1= b1.time left join tab1 c1 on a1.id = c1.id and a1.time+1 …

3
使用LIMIT是否可以提高性能,并且引人注意?
我想了解以下内容。 假设我有一个复杂的查询,假设一个5个表的联接按求和和排序。 抛开对查询本身的任何优化(例如索引等)。使用 是否有任何明显的性能优势LIMIT?我认为必须在应用LIMIT 之前处理所有查询(和结果),因此使用LIMIT检索结果的子集,这是否会带来重大/显着的改进?

1
为什么不能使用sys.query_store_plan加入消除功能?
以下是查询存储遇到的性能问题的简化: CREATE TABLE #tears ( plan_id bigint NOT NULL ); INSERT #tears (plan_id) VALUES (1); SELECT T.plan_id FROM #tears AS T LEFT JOIN sys.query_store_plan AS QSP ON QSP.plan_id = T.plan_id; 该plan_id列被记录为的主键sys.query_store_plan,但是执行计划未按预期使用联接消除: 没有从DMV投影任何属性。 DMV主键plan_id不能复制临时表中的行 使用A LEFT JOIN,因此无法T消除中的任何行。 执行计划 为什么会这样?在这里如何做才能消除连接?

2
MySQL:左外部联接和内部联接之间哪个联接更好
如果所有连接都提供相同的结果,哪个连接比较好执行?例如,我有两个表employees(emp_id,name, address, designation, age, sex)和work_log(emp_id,date,hours_wored)。为了得到一些特定的结果,inner join并left join给出相同的结果。但是,我还有一些疑问,不仅限于这个问题。 在结果值相同的情况下,哪个连接更有效? 申请加入时还必须考虑哪些其他因素? 内部联接和交叉联接之​​间有什么关系吗?

3
为什么此完全外部联接不起作用?
我之前曾使用“完全外部联接”来获得所需的结果,但也许我不完全理解该概念,因为我无法完成应该是简单联接的工作。 我有2个表(分别称为t1和t2),每个表有2个字段: 11 Policy_Number Premium 101 15 102 7 103 10 108 25 111 3 t2 Policy_Number Loss 101 5 103 9 107 20 我想做的是从两个表以及Policy_Number中获得保险费和损失总和。我使用的代码是: select sum(premium) Prem_Sum, sum(Loss) Loss_Sum, t1.policynumber from t1 full outer join t2 on t1.policynumber = t2.policynumber group by t1.policynumber 上面的代码将返回正确的总和,但会将“ policy_number”下“ policy_number”不匹配的所有记录分组。 我希望我的结果看起来像这样 Policy_Number Prem_Sum …

3
Oracle的左连接和where子句错误
CREATE TABLE "ATABLE1" ( "COLUMN1" VARCHAR2(20 BYTE), "COLUMN2" VARCHAR2(20 BYTE) ); CREATE TABLE "ATABLE2" ( "COLUMN1" VARCHAR2(20 BYTE), "COLUMN2" VARCHAR2(20 BYTE) ); Insert into ATABLE1 (COLUMN1,COLUMN2) values ('A','1'); Insert into ATABLE1 (COLUMN1,COLUMN2) values ('B','2'); Insert into ATABLE2 (COLUMN1,COLUMN2) values ('A',null); Insert into ATABLE2 (COLUMN1,COLUMN2) values ('A','1'); Insert into ATABLE2 (COLUMN1,COLUMN2) …
10 oracle  join 

1
嵌套在OUTER JOIN内部的INNER JOIN语法与查询结果
TLDR;如果您查看这两个执行计划,有一个简单的答案是哪个更好?我故意没有创建索引,因此更容易看到正在发生的事情。 在我之前的问题(我们发现不同的联接样式(即嵌套与传统)之间的查询性能差异)进行了跟进之后,我意识到嵌套语法也可以修改查询的行为。考虑以下两个查询。 SELECT a.*, m.*, n.* FROM dbo.Autos a LEFT JOIN dbo.Models m JOIN dbo.Manufacturers n -- <-- Nested INNER JOIN ON n.ManufacturerID = m.ManufacturerID ON m.ModelID = a.ModelID 这并不一定使制造商加入,以包括与ModelID自动行是不是在型号表。 使用传统语法,我们必须将Manufactures的联接更改为外部联接,就像这样……但这会更改查询计划。 SELECT a.*, m.*, n.* FROM dbo.Autos a LEFT JOIN dbo.Models m ON m.ModelID = a.ModelID LEFT JOIN dbo.Manufacturers n …

1
通过多个联接对不同行求和
架构: CREATE TABLE "items" ( "id" SERIAL NOT NULL PRIMARY KEY, "country" VARCHAR(2) NOT NULL, "created" TIMESTAMP WITH TIME ZONE NOT NULL, "price" NUMERIC(11, 2) NOT NULL ); CREATE TABLE "payments" ( "id" SERIAL NOT NULL PRIMARY KEY, "created" TIMESTAMP WITH TIME ZONE NOT NULL, "amount" NUMERIC(11, 2) NOT NULL, …


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.