在显式vs隐式内连接中是否存在效率差异?例如:
SELECT * FROM
table a INNER JOIN table b
ON a.id = b.id;
Run Code Online (Sandbox Code Playgroud)
与
SELECT a.*, b.*
FROM table a, table b
WHERE a.id = b.id;
Run Code Online (Sandbox Code Playgroud) 我读了这篇文章: SELECT语句的逻辑处理顺序
在文章的最后已经写过ON和JOIN子句在WHERE之前考虑.
考虑一下我们有一个拥有10百万记录的主表和一个具有50百万记录的详细信息表(引用主表(FK)).我们有一个查询根据主表中的PK只有100条详细记录表.
在这种情况下,ON和JOIN在WHERE之前执行吗?我的意思是我们在JOIN之后有500百万条记录然后WHERE适用于它吗?或者首先应用WHERE然后JOIN和ON考虑?如果第二个答案是真的那么它与top无关文章?
谢谢
我遇到了一个非常令人困惑的情况,这使我质疑我对SQL Server中的连接的理解.
SELECT t1.f2
FROM t1
LEFT JOIN t2
ON t1.f1 = t2.f1 AND cond2 AND t2.f3 > something
Run Code Online (Sandbox Code Playgroud)
不会给出相同的结果:
SELECT t1.f2
FROM t1
LEFT JOIN t2
ON t1.f1 = t2.f1 AND cond2
WHERE t2.f3 > something
Run Code Online (Sandbox Code Playgroud)
可以通过告诉这两个查询是否应该是等价的来取悦某人的帮助吗?
谢谢
我正在尝试构建一个查询,其中包含一个列,指示用户是否已下载文档.我有一个名为HasDownloaded的表,其中包含以下列:id,documentID,memberID.找出用户是否已下载特定文档很容易; 但我需要生成一个查询,其结果将如下所示:
name id
----------------------
abc NULL
bbb 2
ccc 53
ddd NULL
eee 13
Run Code Online (Sandbox Code Playgroud)
身份证并不重要; 我感兴趣的是文件是否已下载(是否为NULL).
这是我的查询:
SELECT Documents.name, HasDownloaded.id FROM Documents
LEFT JOIN HasDownloaded ON HasDownloaded.documentID = Documents.id
WHERE HasDownloaded.memberID = @memberID
Run Code Online (Sandbox Code Playgroud)
问题是,只有在HasDownloaded表中存在指定用户的条目时,才会返回值.我想保持这种简单,只具有条目HasDownloaded该文件已被下载.因此,如果用户1已经下载了abc,bbb和ccc,我仍然希望ddd和eee显示在结果表中,只是id为NULL.但是WHERE子句只给出了存在条目的值.
我不是一个SQL专家 - 有没有一个运营商会给我我想要的东西?我应该采取不同的方法吗?或者这不可能吗?
做某事之间是否有区别?
SELECT *
FROM table1 INNER JOIN table2 ON table2.ObjectId = table1.table2ObjectId
WHERE table2.Value = 'Foo'
Run Code Online (Sandbox Code Playgroud)
VS
SELECT *
FROM table1 INNER JOIN table2
ON table2.ObjectId = table1.table2ObjectId AND table2.Value = 'Foo'
Run Code Online (Sandbox Code Playgroud) 与WHERE子句相反,在连接中进行过滤是否有任何明显的性能参数?
例如,
SELECT blah FROM TableA a
INNER JOIN TableB b
ON b.id = a.id
AND b.deleted = 0
WHERE a.field = 5
Run Code Online (Sandbox Code Playgroud)
相反
SELECT blah FROM TableA a
INNER JOIN TableB b
ON b.id = a.id
WHERE a.field = 5
AND b.deleted = 0
Run Code Online (Sandbox Code Playgroud)
我个人更喜欢后者,因为我觉得过滤应该在过滤部分(WHERE)中完成,但是有任何性能或其他原因要做任何一种方法吗?
我正在编写一种旅行"约会"应用程序.
表1:用户
id (key) | gender | pref_m | pref_f
------------------------------------
1 male 1 0
2 male 1 1
表2:乡村选择
id (key) | userid | countryid
------------------------------------
1 1 123
2 1 111
3 1 100
4 1 110
5 2 123
6 2 111
7 2 202
8 2 210
输入:当前用户的用户ID
输出(逻辑):选择的用户ID,并且要为我做的到同一个国家的全体人民的配套的国家,并希望与别人有我的性别去旅行
(加盟)是中选择我显然只需要那些我正在寻找性别的人.
由拥有最多匹配国家/地区的人订购DESC.
$sql = "SELECT userid,count(*) AS matches from countryselection";
这给了我一个列表,列出了所有想要和我一起旅行到同一个国家的人(以及我们有多少个共同国家)
$sql .= " WHERE countryid IN (SELECT countryid FROM countryselection WHERE userid = :userid) GROUP BY userid ORDER BY matches DESC;";
我显然在与性别选择部分斗争.
不确定我是否做了正确的事情以我的方式存储用户选择. …
在我的场景中,我有一个BlogPost模型has_and_belongs_to_many :categories.我想筛选出属于特定的类别,同时仍允许未分类的博客文章(因此需要一个LEFT OUTER JOIN)博客文章.
我希望这可行:
BlogPost.active.includes(:categories).where.not(categories: { id: [1, 2, 3] })
Run Code Online (Sandbox Code Playgroud)
但它没有正确过滤,因为它将条件放在查询的末尾,在LEFT OUTER JOIN之外(请参阅此SO问题/答案,原因是:SQL join:where子句与on子句)
这有效,但很难看:
BlogPost.active.joins("LEFT OUTER JOIN blog_posts_categories
ON blog_posts_categories.blog_post_id = blog_posts.id
AND blog_posts_categories.category_id NOT IN(1, 2, 3)")
Run Code Online (Sandbox Code Playgroud)
是否有一种ActiveRecord友好的方式来添加条件到LEFT OUTER JOIN的ON子句而不用我的方式手动输入它?
我遇到了以不同的方式编写查询,如下面的Type-I所示
SELECT JS.JobseekerID
, JS.FirstName
, JS.LastName
, JS.Currency
, JS.AccountRegDate
, JS.LastUpdated
, JS.NoticePeriod
, JS.Availability
, C.CountryName
, S.SalaryAmount
, DD.DisciplineName
, DT.DegreeLevel
FROM Jobseekers JS
INNER
JOIN Countries C
ON JS.CountryID = C.CountryID
INNER
JOIN SalaryBracket S
ON JS.MinSalaryID = S.SalaryID
INNER
JOIN DegreeDisciplines DD
ON JS.DegreeDisciplineID = DD.DisciplineID
INNER
JOIN DegreeType DT
ON JS.DegreeTypeID = DT.DegreeTypeID
WHERE
JS.ShowCV = 'Yes'
Run Code Online (Sandbox Code Playgroud)
II型
SELECT JS.JobseekerID
, JS.FirstName
, JS.LastName
, JS.Currency
, JS.AccountRegDate
, JS.LastUpdated
, …Run Code Online (Sandbox Code Playgroud) 我今天错误地输入了一个查询,但它仍然有效,并给出了预期的结果.我打算运行这个查询:
SELECT e.id FROM employees e JOIN users u ON u.email=e.email WHERE u.id='139840'
Run Code Online (Sandbox Code Playgroud)
但我不小心跑了这个查询
SELECT e.id FROM employees e JOIN users u ON u.email=e.email AND u.id='139840'
Run Code Online (Sandbox Code Playgroud)
(注意AND而不是WHERE在最后一个子句中)
并且都从用户ID返回了正确的员工ID.
这两个查询有什么区别?第二种形式是否只加入满足条件的2个表的成员,而第一个表是否会加入整个表,然后运行查询?一个比另一个更有效还是更低效?这是我缺少的其他东西吗?
谢谢!
sql ×7
inner-join ×4
sql-server ×4
join ×3
left-join ×2
mysql ×2
activerecord ×1
database ×1
performance ×1
php ×1
t-sql ×1