Questions tagged «join»

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

4
如何联接两个表以获取第二个表中缺少的行
在简单的投票系统中 CREATE TABLE elections ( election_id int(11) NOT NULL AUTO_INCREMENT, title varchar(255), CREATE TABLE votes ( election_id int(11), user_id int(11), FOREIGN KEYs 为了获得用户投票的选举列表,使用了以下JOIN SELECT * FROM elections JOIN votes USING(election_id) WHERE votes.user_id='x' 但是如何获取用户未投票的选举列表?
21 join  select 

3
列名命名约定和最佳实践
在列命名方面,我想对最佳做法提出一些专家意见。 背景是根据Wikipedia的以下语法, SELECT ... FROM Employees JOIN Timesheets USING (EmployeeID); 比 SELECT ... FROM Employees JOIN Timesheets ON (Employees.EmployeeID = Timesheets.EmployeeID); 但是,该JOIN ... USING语法仅适用于所有具有全局唯一名称的主键列。因此,我想知道这是否被认为是正确的做法。 我个人经常使用PK列id和外键列创建表othertable_id。但是那样就无法使用USING或NATURAL JOIN。 任何与设计风格或表设计最佳实践指南的链接也将不胜感激!

3
将具有多个联接的SQL查询拆分为较小的联接有帮助吗?
我们需要每晚在SQL Server 2008 R2上进行一些报告。计算报告需要几个小时。为了缩短时间,我们预先计算了一张桌子。该表是基于JOINining 12个很大的表(数十亿行)创建的。 直到几天前cca才花费了4个小时来计算此聚合表。我们的DBA将此大联接分成3个较小的联接(每个联接4个表)。每次都将临时结果保存到一个临时表中,该表将在下一个联接中使用。 DBA增强的结果是,聚合表是在15分钟内计算出来的。我想知道这怎么可能。DBA告诉我,这是因为服务器必须处理的数据数量较少。换句话说,在大型原始联接中,与汇总较小的联接相比,服务器必须处理更多的数据。但是,我认为优化器将通过原始的大联接有效地完成此任务,自行拆分联接并仅发送下一个联接所需的列数。 他所做的另一件事是他在一个临时表上创建了一个索引。但是,我再一次认为优化器将在需要时创建适当的哈希表,从而更好地优化计算。 我曾与我们的DBA讨论过此事,但他本人不确定是什么原因导致了处理时间的缩短。他只是提到,他不会怪服务器,因为计算如此大的数据可能不堪重负,而且优化器可能很难预测最佳的执行计划...。我了解这一点,但是我想对原因进行更多定义。 因此,问题是: 有什么可能导致重大改进? 将大联接拆分为较小联接是标准程序吗? 如果有多个较小的联接,则服务器必须处理的数据量真的减少了吗? 这是原始查询: Insert Into FinalResult_Base SELECT TC.TestCampaignContainerId, TC.CategoryId As TestCampaignCategoryId, TC.Grade, TC.TestCampaignId, T.TestSetId ,TL.TestId ,TSK.CategoryId ,TT.[TestletId] ,TL.SectionNo ,TL.Difficulty ,TestletName = Char(65+TL.SectionNo) + CONVERT(varchar(4),6 - TL.Difficulty) ,TQ.[QuestionId] ,TS.StudentId ,TS.ClassId ,RA.SubjectId ,TQ.[QuestionPoints] ,GoodAnswer = Case When TQ.[QuestionPoints] Is null Then …

2
SQL Server联接/位置处理顺序
在阅读了慢速SQL查询之后,不确定如何优化,这让我开始思考查询的一般性能。当然,我们需要将第一个表(在连接其他表时)的结果尽可能小,然后再进行连接(此问题的内部连接),以使我们的查询快一点。 示例,应该这样: SELECT * FROM ( SELECT * FROM table1 WHERE col = @val ) t INNER JOIN table2 ON col = col2 比以下更好/更快: SELECT * FROM table1 INNER JOIN table2 ON col = col2 WHERE table1.col = @val 我的理论如下(这可能不是正确的实现,我试图从我读过的一本SQL Server 2008内部书籍(MSFT Press)中记住): 查询处理器首先获取左表(表1) 在过滤掉必要的行之前,连接第二个表(表2)并形成笛卡尔积(如果适用) 然后使用SEELCT语句最后执行WHERE,ORDER BY,GROUP BY,HAVING子句。 因此,如果在上面的语句1中表较小,则在形成笛卡尔积时SQL引擎要做的工作较少。然后,当您到达where语句时,您将得到减少的结果集,可以从中筛选出结果集。 我可能还差得远,这是不真实的。就像我说的,这是一种理论。 …

1
使用USING子句命名函数参数和JOIN结果之间的冲突
鉴于当前Postgres 9.4中的设置(来自此相关问题): CREATE TABLE foo (ts, foo) AS VALUES (1, 'A') -- int, text , (7, 'B'); CREATE TABLE bar (ts, bar) AS VALUES (3, 'C') , (5, 'D') , (9, 'E'); 上一个问题还有一个SQL Fiddle。 我写了SELECT一个FULL JOIN以实现所引用问题的目的。简化: SELECT ts, f.foo, b.bar FROM foo f FULL JOIN bar b USING (ts); 根据规范,解决列的正确方法ts是不使用表限定。任一的输入值(f.ts或b.ts)可以是NULL。该USING子句会产生一些奇怪的情况:引入输入中实际上不存在的“输入”列。到目前为止,一切都很优雅。 …

3
什么效率更高,使用where子句或使用具有百万个以上行表的联接?
我们运行的网站在一个表中有250MM行,而在大多数查询中,与之连接的另一个表中的行都不到15MM。 样本结构: MasterTable (Id, UserId, Created, Updated...) -- 15MM Rows DetailsTable (Id, MasterId, SomeColumn...) -- 250MM Rows UserTable (Id, Role, Created, UserName...) -- 12K Rows 我们通常必须对所有这些表进行一些查询。一种是获取免费用户(约1万个免费用户)的统计信息。 Select Count(1) from DetailsTable dt join MasterTable mt on mt.Id = dt.MasterId join UserTable ut on ut.Id = mt.UserId where ut.Role is null and …


2
简单联接中未使用的主键索引
我有以下表和索引定义: CREATE TABLE munkalap ( munkalap_id serial PRIMARY KEY, ... ); CREATE TABLE munkalap_lepes ( munkalap_lepes_id serial PRIMARY KEY, munkalap_id integer REFERENCES munkalap (munkalap_id), ... ); CREATE INDEX idx_munkalap_lepes_munkalap_id ON munkalap_lepes (munkalap_id); 为什么在以下查询中不使用munkalap_id上的索引? EXPLAIN ANALYZE SELECT ml.* FROM munkalap m JOIN munkalap_lepes ml USING (munkalap_id); QUERY PLAN Hash Join (cost=119.17..2050.88 …

2
特殊的Oracle外连接语法案例
我在应该从Oracle外连接语法移植到SQL标准外连接语法的查询中看到了以下内容: SELECT ... FROM A, B, C, D, E WHERE A.A_ID = B.A_ID AND B.B_ID = C.A_ID(+) AND B.B_KEY = C.B_KEY(+) AND C.C_ID = D.C_ID(+) AND B.A_ID = E.A_ID(+) AND B.B_KEY = E.B_KEY(+) AND 'CONSTANT' = C.X_ID(+) 现在,翻译外部联接语法通常是一个机械过程,但是最后一行让我感到困惑。这是什么意思?它有什么作用?
16 oracle  join  syntax 

2
PostgreSQL使用JSONB加入
我有这个SQL: CREATE TABLE test(id SERIAL PRIMARY KEY, data JSONB); INSERT INTO test(data) VALUES ('{"parent":null,"children":[2,3]}'), ('{"parent":1, "children":[4,5]}'), ('{"parent":1, "children":[]}'), ('{"parent":2, "children":[]}'), ('{"parent":2, "children":[]}'); 这将给: id | data ----+-------------------------------------- 1 | {"parent": null, "children": [2, 3]} 2 | {"parent": 1, "children": [4, 5]} 3 | {"parent": 1, "children": []} 4 | {"parent": …

4
递归自我联接
我有一张comments桌子,可以简化为: comments ======= id user_id text parent_id where parent_id可为空,但可能是其父注释的键。 现在,我该如何select评论所有后代? 评论可能会降低几个级别...

1
删除其他表中未引用的行
我在PostgreSQL 9.3数据库中有两个表:表link_reply有一个名为which_group指向table 的外键link_group。 我要删除link_group不link_reply存在相关行的所有行。听起来很基本,但我一直在努力。 这样简单吗(不起作用)? DELETE FROM link_group WHERE link_reply = NULL;

4
连接在运行时是否优化到where子句?
当我写这样的查询... select * from table1 t1 join table2 t2 on t1.id = t2.id SQL优化器不确定将其翻译为...吗? select * from table1 t1, table2 t2 where t1.id = t2.id 从本质上讲,SQL Server中的Join语句只是编写sql的一种简便方法吗?还是在运行时实际使用? 编辑:我几乎总是并且几乎总是会使用Join语法。我很好奇发生了什么。

5
在MySQL中将单列与多个值匹配而不使用自联接表
我们有一个表,用于存储问题的答案。我们需要能够找到对特定问题有特定答案的用户。因此,如果我们的表包含以下数据: user_id question_id answer_value Sally 1 Pooch Sally 2 Peach John 1 Pooch John 2 Duke 并且我们想找到对问题1回答“ Pooch”而对问题2回答“ Peach”的用户,则以下SQL(显然)不会起作用: select user_id from answers where question_id=1 and answer_value = 'Pooch' and question_id=2 and answer_value='Peach' 我的第一个想法是针对需要的每个答案自行加入表格: select a.user_id from answers a, answers b where a.user_id = b.user_id and a.question_id=1 and a.answer_value = …

1
为什么PostgreSQL选择较昂贵的联接顺序?
PostgreSQL使用默认值,加上 default_statistics_target=1000 random_page_cost=1.5 版 PostgreSQL 10.4 on x86_64-pc-linux-musl, compiled by gcc (Alpine 6.4.0) 6.4.0, 64-bit 我已经吸尘并进行了分析。该查询非常简单: SELECT r.price FROM account_payer ap JOIN account_contract ac ON ap.id = ac.account_payer_id JOIN account_schedule "as" ON ac.id = "as".account_contract_id JOIN schedule s ON "as".id = s.account_schedule_id JOIN rate r ON s.id = r.schedule_id WHERE …

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.