相关疑难解决方法(0)

显式vs隐式SQL连接

在显式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)

sql join

380
推荐指数
7
解决办法
16万
查看次数

WHERE子句在IN和JOIN之前或之后更好地执行

我读了这篇文章: SELECT语句的逻辑处理顺序

在文章的最后已经写过ON和JOIN子句在WHERE之前考虑.

考虑一下我们有一个拥有10百万记录的主表和一个具有50百万记录的详细信息表(引用主表(FK)).我们有一个查询根据主表中的PK只有100条详细记录表.

在这种情况下,ON和JOIN在WHERE之前执行吗?我的意思是我们在JOIN之后有500百万条记录然后WHERE适用于它吗?或者首先应用WHERE然后JOIN和ON考虑?如果第二个答案是真的那么它与top无关文章?

谢谢

sql-server

27
推荐指数
4
解决办法
6万
查看次数

WHERE子句中具有条件的LEFT JOIN与ON中的相同LEFT JOIN不等同的原因和原因是什么?

我遇到了一个非常令人困惑的情况,这使我质疑我对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)

可以通过告诉这两个查询是否应该是等价的来取悦某人的帮助吗?

谢谢

sql t-sql sql-server left-join

21
推荐指数
2
解决办法
6万
查看次数

在LEFT JOIN SQL查询上帮助WHERE

我正在尝试构建一个查询,其中包含一个列,指示用户是否已下载文档.我有一个名为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专家 - 有没有一个运营商会给我我想要的东西?我应该采取不同的方法吗?或者这不可能吗?

sql join left-join

19
推荐指数
1
解决办法
3万
查看次数

INNER JOIN Where Clause

做某事之间是否有区别?

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)

sql sql-server

17
推荐指数
1
解决办法
7万
查看次数

加入融合?

与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)中完成,但是有任何性能或其他原因要做任何一种方法吗?

sql-server inner-join

16
推荐指数
1
解决办法
3万
查看次数

SQL语句我无法绕过脑袋(大脑太小)

我正在编写一种旅行"约会"应用程序.

  • 用户注册自己
  • 用户告诉应用程序他们是男性还是女性
  • 用户告诉应用他们想访问哪些国家/地区
  • 用户告诉应用程序他们是否想要与男性(pref_m = 1)或女性(pref_f = 1)一起旅行

我的桌子

表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

那么select语句必须做什么

输入:当前用户的用户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;";
这给了我一个列表,列出了所有想要和我一起旅行到同一个国家的人(以及我们有多少个共同国家)

最后的说明

我显然在与性别选择部分斗争.
不确定我是否做了正确的事情以我的方式存储用户选择. …

php sql inner-join

9
推荐指数
1
解决办法
419
查看次数

Rails包含()LEFT OUTER JOIN和自定义ON子句

在我的场景中,我有一个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子句而不用我的方式手动输入它?

sql activerecord join ruby-on-rails rails-activerecord

9
推荐指数
1
解决办法
2191
查看次数

哪个查询更好,更有效 - mysql

我遇到了以不同的方式编写查询,如下面的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)

mysql database database-design inner-join

7
推荐指数
1
解决办法
401
查看次数

WHERE子句或ON子句中的INNER JOIN条件?

我今天错误地输入了一个查询,但它仍然有效,并给出了预期的结果.我打算运行这个查询:

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个表的成员,而第一个表是否会加入整个表,然后运行查询?一个比另一个更有效还是更低效?这是我缺少的其他东西吗?

谢谢!

mysql sql performance inner-join

6
推荐指数
1
解决办法
3704
查看次数