这是关于data.table连接语法的一个哲学问题.我发现data.tables的用途越来越多,但仍在学习......
X[Y]data.tables 的连接格式非常简洁,方便和高效,但据我所知,它只支持内连接和右外连接.要获得左外部或全外部连接,我需要使用merge:
X[Y, nomatch = NA] - Y中的所有行 - 右外连接(默认)X[Y, nomatch = 0] - 只有在X和Y中都匹配的行 - 内连接merge(X, Y, all = TRUE) - 来自X和Y的所有行 - 完全外部连接merge(X, Y, all.x = TRUE) - X中的所有行 - 左外连接在我看来,如果X[Y]连接格式支持所有4种类型的连接,那将会很方便.有没有理由只支持两种类型的连接?
对我来说,nomatch = 0和nomatch = NA参数值对于正在执行的操作不是非常直观.这是我更容易理解和记忆的merge语法:all = TRUE,all.x = TRUE和all.y = TRUE.由于X[Y]操作类似于merge远远不止match,为什么不使用merge的连接,而不是语法match功能的nomatch参数?
以下是4种连接类型的代码示例:
# …Run Code Online (Sandbox Code Playgroud) 我有2个子查询,但是我无法从同一个表中将列连接在一起.我试过了:
SELECT * FROM
(SELECT userid, listid
FROM user_views_table
WHERE date='2013-05-15' AND view_type='lists') a
JOIN
(SELECT sourceid, destinationid
FROM actions_table
WHERE date='2013-05-15' AND payloadtype='lists_user' AND actiontype='delete') b
ON a.userid = b.sourceid
ON a.listid = b.destinationid;
Run Code Online (Sandbox Code Playgroud)
如果我只是用ON a.userid = b.sourceid它结束查询工作,但我怎么也可以在另一列上加入这些表ON a.listid = b.destinationid?
任何帮助赞赏.
我最近想使用boost :: algorithm :: join但我找不到任何用法示例,我不想花很多时间学习Boost Range库只是为了使用这个函数.
任何人都可以提供一个如何在字符串容器上使用连接的好例子吗?谢谢.
JPA的获取策略到底控制了什么?我无法发现渴望和懒惰之间的任何区别.在这两种情况下,JPA/Hibernate都不会自动加入多对一关系.
示例:Person有一个地址.地址可以属于很多人.JPA带注释的实体类看起来像:
@Entity
public class Person {
@Id
public Integer id;
public String name;
@ManyToOne(fetch=FetchType.LAZY or EAGER)
public Address address;
}
@Entity
public class Address {
@Id
public Integer id;
public String name;
}
Run Code Online (Sandbox Code Playgroud)
如果我使用JPA查询:
select p from Person p where ...
Run Code Online (Sandbox Code Playgroud)
JPA/Hibernate生成一个SQL查询以从Person表中进行选择,然后为每个人选择一个不同的地址查询:
select ... from Person where ...
select ... from Address where id=1
select ... from Address where id=2
select ... from Address where id=3
Run Code Online (Sandbox Code Playgroud)
这对于大型结果集非常糟糕.如果有1000个人,则会生成1001个查询(1个来自Person,1000个来自地址).我知道这是因为我正在查看MySQL的查询日志.我的理解是,将地址的提取类型设置为eager会导致JPA/Hibernate自动使用连接进行查询.但是,无论获取类型如何,它仍会为关系生成不同的查询.
只有当我明确告诉它加入时它才真正加入:
select p, a from Person p left join p.address …Run Code Online (Sandbox Code Playgroud) 在我所工作的每家公司,我发现人们仍然在ANSI-89标准中编写SQL查询:
select a.id, b.id, b.address_1
from person a, address b
where a.id = b.id
Run Code Online (Sandbox Code Playgroud)
而不是ANSI-92标准:
select a.id, b.id, b.address_1
from person a
inner join address b
on a.id = b.id
Run Code Online (Sandbox Code Playgroud)
对于这样一个非常简单的查询,可读性没有太大差异,但是对于大型查询,我发现将我的连接条件分组并列出表格可以更容易地查看我在连接中可能存在问题的位置,以及让我在WHERE子句中保留所有过滤功能.更不用说我觉得外连接比Oracle中的(+)语法更直观.
当我尝试向人们传播ANSI-92时,使用ANSI-92而不是ANSI-89有什么具体的性能优势吗?我会自己尝试,但是我们这里的Oracle设置不允许我们使用EXPLAIN PLAN - 不希望人们尝试优化他们的代码,是吗?
我有以下查询:
SELECT
dashboard_data.headline,
dashboard_data.message,
dashboard_messages.image_id
FROM dashboard_data
INNER JOIN dashboard_messages
ON dashboard_message_id = dashboard_messages.id
Run Code Online (Sandbox Code Playgroud)
所以我正在使用INNER JOIN并抓住了image_id.所以现在,我想把image_id images.filename从图像表中转换成.
如何将其添加到我的查询中?
使用accepts_nested_attributes_for时如何编辑连接模型的属性?
我有3个模型:由连接器加入的主题和文章
class Topic < ActiveRecord::Base
has_many :linkers
has_many :articles, :through => :linkers, :foreign_key => :article_id
accepts_nested_attributes_for :articles
end
class Article < ActiveRecord::Base
has_many :linkers
has_many :topics, :through => :linkers, :foreign_key => :topic_id
end
class Linker < ActiveRecord::Base
#this is the join model, has extra attributes like "relevance"
belongs_to :topic
belongs_to :article
end
Run Code Online (Sandbox Code Playgroud)
所以当我在主题控制器的"新"动作中构建文章时......
@topic.articles.build
Run Code Online (Sandbox Code Playgroud)
...并在topics/new.html.erb中创建嵌套表单...
<% form_for(@topic) do |topic_form| %>
...fields...
<% topic_form.fields_for :articles do |article_form| %>
...fields...
Run Code Online (Sandbox Code Playgroud)
... Rails自动创建链接器,这很棒. 现在我的问题是:我的链接器模型还具有我希望能够通过"新主题"表单更改的属性.但是Rails自动创建的链接器除了topic_id和article_id之外,其所有属性都有nil值.如何将其他链接器属性的字段放入"新主题"表单中,这样它们就不会出现?
我想知道我是否有这样的连接查询 -
Select E.Id,E.Name from Employee E join Dept D on E.DeptId=D.Id
Run Code Online (Sandbox Code Playgroud)
和这样的子查询 -
Select E.Id,E.Name from Employee Where DeptId in (Select Id from Dept)
Run Code Online (Sandbox Code Playgroud)
当我考虑性能时,哪两个查询会更快,为什么?
还有一段时间我应该更喜欢一个吗?
对不起,如果这是太微不足道,以前问过,但我很困惑.此外,如果你们可以建议我用来测量两个查询的性能的工具,那将是很棒的.非常感谢!
这有点复杂,但我有2张桌子.假设结构是这样的:
*Table1*
ID
PhoneNumber1
PhoneNumber2
*Table2*
PhoneNumber
SomeOtherField
Run Code Online (Sandbox Code Playgroud)
可以基于Table1.PhoneNumber1 - > Table2.PhoneNumber或Table1.PhoneNumber2 - > Table2.PhoneNumber来连接表.
现在,我想得到一个结果集,其中包含PhoneNumber1,SomeOtherField,它对应于PhoneNumber1,PhoneNumber2和SomeOtherField,对应于PhoneNumber2.
我想到了两种方法 - 通过两次加入表,或者在ON子句中加入OR一次.
方法1:
SELECT t1.PhoneNumber1, t1.PhoneNumber2,
t2.SomeOtherFieldForPhone1, t3.someOtherFieldForPhone2
FROM Table1 t1
INNER JOIN Table2 t2
ON t2.PhoneNumber = t1.PhoneNumber1
INNER JOIN Table2 t3
ON t3.PhoneNumber = t1.PhoneNumber2
Run Code Online (Sandbox Code Playgroud)
这似乎有效.
方法2:
以某种方式有一个看起来有点像这样的查询 -
SELECT ...
FROM Table1
INNER JOIN Table2
ON Table1.PhoneNumber1 = Table2.PhoneNumber OR
Table1.PhoneNumber2 = Table2.PhoneNumber
Run Code Online (Sandbox Code Playgroud)
我还没有得到这个工作,我不确定是否有办法做到这一点.
实现这一目标的最佳方法是什么?这两种方式都不简单或直观......有没有更简单的方法来做到这一点?这个要求一般如何实施?
我有两个表date和id字段表.我想加入这两个领域.我试过了
JOIN t2 ON CONCAT(t1.id, t1.date)=CONCAT(t2.id, t2.date)
Run Code Online (Sandbox Code Playgroud)
这是有效的,但它很慢.有一个更好的方法吗?