Questions tagged «join»

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

3
如何提示SQL Server中的多对多联接?
我有3个“大”表,它们连接在一对列(均为int)上。 Table1拥有约2亿行 Table2拥有约150万行 Table3拥有约600万行 每个表都有一个聚集索引Key1,Key2以及再得一列。Key1具有低基数并且非常偏斜。WHERE子句中始终引用它。条款中Key2从未提及WHERE。每个联接都是多对多的。 问题在于基数估计。每个连接的输出估计值变小而不是变大。当实际结果达到数百万时,最终得出的结果估计只有几百个。 我有什么办法让行政长官提示做出更好的估计? SELECT 1 FROM Table1 t1 JOIN Table2 t2 ON t1.Key1 = t2.Key1 AND t1.Key2 = t2.Key2 JOIN Table3 t3 ON t1.Key1 = t3.Key1 AND t1.Key2 = t3.Key2 WHERE t1.Key1 = 1; 我尝试过的解决方案: 在创建多列统计Key1,Key2 创建大量已过滤的统计信息Key1(这很有帮助,但是我最终在数据库中获得了数千个用户创建的统计信息。) 掩盖的执行计划(抱歉掩盖不好) 就我而言,结果有900万行。新的CE估计有180行;旧版CE估计有6100行。 这是一个可重现的示例: DROP TABLE IF EXISTS #Table1, #Table2, …

2
对范围内的每个日期运行复杂的查询
我有一张订单表 Column | Type | Modifiers ------------+-----------------------------+----------------------------------------------------- id | integer | not null default nextval('orders_id_seq'::regclass) client_id | integer | not null start_date | date | not null end_date | date | order_type | character varying | not null 数据的client_id具有不重叠的常规,并且在临时数据具有匹配的client_id时,有时会覆盖其start_date上的常规。存在应用程序级别约束,以防止相同类型的订单重叠。 id | client_id | start_date | end_date | order_type ----+-----------+------------+------------+------------ 17 …

2
MySQL:delete…where..in()vs delete..from..join,并使用subselect锁定删除表
免责声明:请原谅我缺乏数据库内部知识。它去了: 我们运行的应用程序(不是我们编写的)在数据库的定期清理作业中存在很大的性能问题。查询如下所示: delete from VARIABLE_SUBSTITUTION where BUILDRESULTSUMMARY_ID in ( select BUILDRESULTSUMMARY_ID from BUILDRESULTSUMMARY where BUILDRESULTSUMMARY.BUILD_KEY = "BAM-1"); 直截了当,易于阅读和标准SQL。但不幸的是非常缓慢。对查询进行解释说明VARIABLE_SUBSTITUTION.BUILDRESULTSUMMARY_ID未使用现有索引on : mysql> explain delete from VARIABLE_SUBSTITUTION where BUILDRESULTSUMMARY_ID in ( -> select BUILDRESULTSUMMARY_ID from BUILDRESULTSUMMARY -> where BUILDRESULTSUMMARY.BUILD_KEY = "BAM-1"); | id | select_type | table | type | possible_keys | key …

2
我应该在SQL Server中嵌套依赖的外部联接吗?
我听说过与此相关的信息不一,并希望能提出规范或专家意见。 如果我有多个LEFT OUTER JOIN,每个都依赖于最后一个,嵌套它们会更好吗? 对于一个人为的示例,JOINto MyParent取决于JOINto MyChild:http : //sqlfiddle.com/#!3/31022/5 SELECT {columns} FROM MyGrandChild AS gc LEFT OUTER JOIN MyChild AS c ON c.[Id] = gc.[ParentId] LEFT OUTER JOIN MyParent AS p ON p.[id] = c.[ParentId] 与http://sqlfiddle.com/#!3/31022/7相比 SELECT {columns} FROM MyGrandChild AS gc LEFT OUTER JOIN ( MyChild AS c LEFT …

3
如何多次连接到同一张表?
我有两个表,“ hierarchy_table”和“ name_table”。 层次结构表包含一个具有多个父级和子级的对象。每个父母和孩子都由id引用。 | object_id | parent_id_1 | parent_id_2 | child_id_1 | child_id_2 | ----------------------------------------------------------------------------- | 1234 | 9999 | 9567 | 5555 | 5556 | ----------------------------------------------------------------------------- 等级表中的每个对象ID在名称表中都有一个条目: | name_id | name | -------------------------- | 1234 | ABCD | -------------------------- | 9999 | ZYXW | -------------------------- | ... 如何将hierarchy_table中的每个ID多次连接到name_table,以便可以得到填充每个名称的结果? …

1
哈希联接vs哈希半联接
PostgreSQL 9.2 我想明白之间的差别Hash Semi Join,只是Hash Join。 这是两个查询: 一世 EXPLAIN ANALYZE SELECT * FROM orders WHERE customerid IN (SELECT customerid FROM customers WHERE state='MD'); Hash Semi Join (cost=740.34..994.61 rows=249 width=30) (actual time=2.684..4.520 rows=120 loops=1) Hash Cond: (orders.customerid = customers.customerid) -> Seq Scan on orders (cost=0.00..220.00 rows=12000 width=30) (actual time=0.004..0.743 rows=12000 loops=1) …

1
如何从oracle中的两个表中获取分层数据?
我有两个表table1和table2,我需要通过连接两个表进行分层输出。 表1包含三个类别CAT1,CAT2和CAT3,其中一个外键即F_ID,它是另一个表table2的主键,表2中又包含一个列,即VAL。 TABLE 1 ----------------- CAT1 CAT2 CAT3 F_ID A a aa 1 A a ab 2 A b ba 3 A b bb 4 B c ca 5 B c cb 6 B d da 7 TABLE 2 ------------------- F_ID VAL 1 4 2 6 3 4 4 1 …

5
SQL查询仅显示单个食品的最新购买记录
我正在使用MS Access 2013中的食品购买/发票系统,正在尝试创建一个SQL查询,该查询将返回每个食品的最新购买价格。 这是我正在使用的表的图表: 我对SQL的理解是非常基础的,因此我尝试了以下(不正确的)查询,希望它对每个项目仅返回一条记录(由于DISTINCT运算符),并且仅返回最近的购买记录(因为我做了ORDER BY [Invoice Date] DESC) SELECT DISTINCT ([Food items].Item), [Food items].Item, [Food purchase data].[Price per unit], [Food purchase data].[Purchase unit], Invoices.[Invoice Date] FROM Invoices INNER JOIN ([Food items] INNER JOIN [Food purchase data] ON [Food items].ID = [Food purchase data].[Food item ID]) ON Invoices.ID = [Food …

2
生成差异的最有效方法
我在SQL Server中有一张表,看起来像这样: Id |Version |Name |date |fieldA |fieldB ..|fieldZ 1 |1 |Foo |20120101|23 | ..|25334123 2 |2 |Foo |20120101|23 |NULL ..|NULL 3 |2 |Bar |20120303|24 |123......|NULL 4 |2 |Bee |20120303|34 |-34......|NULL 我正在研究要比较的存储过程,该过程需要输入数据和版本号。输入数据具有“名称”更新字段Z中的列。预期大多数字段列为NULL,即,每行通常仅具有前几个字段的数据,其余的均为NULL。名称,日期和版本对表构成唯一约束。 对于给定的版本,我需要针对该表比较输入的数据。每行都需要进行区分-通过名称,日期和版本来标识一行,并且字段列中任何值的任何更改都需要在差异中显示。 更新:所有字段都不必为十进制类型。其中一些可能是nvarchars。我希望diff在不转换类型的情况下发生,尽管diff输出可以将所有内容转换为nvarchar,因为它仅用于显示目的。 假设输入为以下,并且请求的版本为2: Name |date |fieldA |fieldB|..|fieldZ Foo |20120101|25 |NULL |.. |NULL Foo |20120102|26 |27 |.. |NULL Bar …

2
SQL Server表插入性能优化
设置 在一个数据仓库中,我将一个事实表连接到20个维度。事实表具有3200万行和30列。这是一个临时暂存表,因此我不必与其他正在读取或写入该表的用户打交道。我从基础表中选择10列,并从各个维度中选择20列。尺寸表很小(介于3到15.000行之间)。连接的字段都是整数和nvarchars。我使用SELECT ... INTO语句。表上没有索引。 该查询的执行速度太慢,无法使用。 尝试过的解决方案 因为查询处理时间太长,所以我尝试了以下解决方案: 将20个联接拆分为5个表上的4个联接。但是查询性能仍然很低。 将索引放在外键列上。没有明显的时间减少。 确保联接条件的字段为整数。我注意到性能提高了25%。不完全是我要寻找的。 使用insert into语句代替select into。尽管数据库处于简单恢复模式,但由于日志文件增长而导致性能更差。 这些发现使我包括了实际的执行计划,该计划表明89%的成本在表插入中。其他成本是对事实表进行8%的表扫描,对内部联接进行2%的哈希匹配。 问题 缓慢插入表的可能原因是什么? 没有执行计划,有哪些方法可以识别此瓶颈? 我可以采取什么措施来减少表格插入的费用?

2
使用JOIN有效地更新表
我有一个表,其中包含住户的详细信息,而另一个表中包含与住户相关的所有人员的详细信息。对于家用表,我有一个主键,它使用两列定义[tempId,n]。对于人员表,我有一个使用其3列定义的主键[tempId,n,sporder] 使用由主键上的聚集索引指示的排序,我为每个家庭[HHID]和每个人[PERID]记录生成了唯一的ID (下面的代码段用于生成PERID): ALTER TABLE dbo.persons ADD PERID INT IDENTITY CONSTRAINT [UQ dbo.persons HHID] UNIQUE; 现在,我的下一步是将每个人与相应的家庭相关联,即:将a映射[PERID]到[HHID]。两个表之间的人行横道基于两列[tempId,n]。为此,我有以下内部连接语句。 UPDATE t1 SET t1.HHID = t2.HHID FROM dbo.persons AS t1 INNER JOIN dbo.households AS t2 ON t1.tempId = t2.tempId AND t1.n = t2.n; 我总共有1928783户家庭记录和5239842人记录。当前执行时间非常长。 现在,我的问题是: 是否可以进一步优化此查询?更一般而言,优化联接查询的经验法则是什么? 是否有另一个查询构造可以在更短的执行时间内达到我想要的结果? 我已将SQL Server 2008生成的针对整个脚本的执行计划上载到 SQLPerformance.com

1
关系是否比没有效率的大桌子慢?
我在工作中被要求多次违反“第一种标准格式”(使用空/空值重复列中的组),“是为了提高计算机处理能力”。简而言之,“学生”表应至少包含8个空字段(例如电话:phone1,电话2,电话3 ...),而不是我的建议-包含电话号码(以及其他可能的元数据)的“电话”表外键是学生证号。我的老板说,最好以这种方式存储它们,因为“ CPU周期更少,这在Web平台中很重要”,而不是使用关系。我说,在最坏的情况下,它可以忽略不计。 在该示例中,使用关系(假设表在中等大小的Web应用程序中充满了很多记录)比使用这种表架构慢得多?

3
JOIN语句的输出是什么样的?
我一直想使用联接一段时间,但是我在可视化输出时遇到了麻烦,因此我知道如何使用它。 假设我有2张桌子: CREATE TABLE Cities ( id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, city tinyblob ); CREATE TABLE Users ( id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, username TINYBLOB, city INT UNSIGNED, FOREIGN KEY (city) REFERENCES Cities (id) ); 如果我的应用程序要运行SQL查询以获取用户的个人资料数据,我将如何使用联接来获取与用户记录相关联的城市,输出的记录将如何显示?

1
使用两个LEFT JOIN还是将AND与单个LEFT JOIN一起使用?
使用两个LEFT JOINs即 SELECT <some columns> FROM Table1 AS t1 LEFT JOIN Table2 AS t2 ON <condition1> LEFT JOIN Table2 AS t3 ON <condition2> 这与AND单人使用相同LEFT JOIN吗?即 SELECT <some columns> FROM Table1 AS t1 LEFT JOIN Table2 AS t2 ON <condition1> AND <condition2> 两者相同还是不同(一般而言)?
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.