我不确定如何描述我的表格结构,所以希望这是有道理的......
我有3个层次关系的表,这样A与B之间有一对多的关系,而B又与C有一对多的关系.诀窍是允许B和C中的外键为空(即没有父项)定义).我也有D和E,与A,B或C(直接)无关.
最后,我有一个F,它是一个与C,D和E有多对一关系的连接表.它的所有字段(FK到其他表)都不可为空.
我想编写一个SQL语句来连接单个结果集中的所有表.我知道我必须使用外部联接,因为我希望所有的A都返回,无论它是否在B中有子项,与B和C类似.
问题一:我一直在研究ANSI外连接语法(之前我只使用过Oracle"(+)")并且找不到外连接超过2个表的示例.有人可以提供/指出一个例子吗?
问题二:是否可以根据连接表F包含表D和E中的记录?如果是这样,这是用外连接完成的吗?
谢谢!
编辑
当然,在我发布这个之后,我找到了一个回答问题1的例子.然而,问题2仍然让我难过.
例:
SELECT A.a,
B.b,
C.c
FROM A
FULL OUTER JOIN B ON B.a = A.a
FULL OUTER JOIN C ON C.b = B.b
Run Code Online (Sandbox Code Playgroud) 如果事先不知道要求和的矩阵数,那么进行分量矩阵加法的最佳方法是什么?更一般地说,有没有一种很好的方法在data.table的上下文中执行矩阵(或多维数组)操作?我data.table通过几个固定变量或类别对数据进行排序和分组的效率,每个变量或类别包含不同数量的观察值.
例如:
这里用2x2矩阵说明,只有一个类别:
library(data.table)
# example data, number of rows differs by category t
N <- 5
dt <- data.table(t = rep(c("a", "b"), each = 3, len = N),
x1 = rep(1:2, len = N), x2 = rep(3:5, len = N),
y1 = rep(1:3, len = N), y2 = rep(2:5, len = N))
setkey(dt, t)
> dt
t x1 x2 y1 y2
1: a 1 3 1 2
2: a 2 4 …Run Code Online (Sandbox Code Playgroud) 我经常在面试中被问到"什么是SQL中的外部联接"?
虽然可以回答,但我想知道使用(LEFT)OUTER JOIN的一些经典和好的现实生活例子是什么?
如果将列表中每个元素的(隐式)索引视为其键,则zipWith有点像关系内连接.它只处理两个输入都具有值的键:
zipWith (+) [1..5] [10..20] == zipWith (+) [1..11] [10..14] == [11,13,15,17,19]
Run Code Online (Sandbox Code Playgroud)
是否存在与外连接对应的规范对应函数?就像是:
outerZipWith :: (a -> b -> c) -> a -> b -> [a] -> [b] -> [c]
outerZipWith _ _ _ [] [] = []
outerZipWith f a' b' [] (b:bs) = f a' b : outerZipWith f a' b' [] bs
outerZipWith f a' b' (a:as) [] = f a b' : outerZipWith f a' b' as []
outerZipWith f a' b' (a:as) (b:bs) …Run Code Online (Sandbox Code Playgroud) 我有以下两个表:
作业 AreaID,JobNo(复合键)
记录 LogID,AreaID,JobNo
我需要获得所有没有与之关联的日志的作业.在SQL中我可以这样做:
SELECT Jobs.AreaID,
Jobs.JobNo
FROM Jobs
LEFT JOIN Logs
ON Jobs.AreaID = Logs.AreaID
AND Jobs.JobNo = Logs.JobNo
WHERE Logs.LogID is null
Run Code Online (Sandbox Code Playgroud)
但我不知道如何用NHibernate来实现这一目标.任何人都可以提供任何指示吗?
这是我的映射:
<class name="Job" table="Jobs">
<composite-key name="Id">
<key-property name="JobNo"/>
<key-many-to-one name="Area" class="Area" column="AreaID"/>
</composite-key>
</class>
<class name="Log" table="Logs">
<id name="Id" column="LogID">
<generator class="identity"/>
</id>
<property name="JobNo"/>
<many-to-one name="Area" class="Area" column="AreaID"/>
</class>
Run Code Online (Sandbox Code Playgroud)
谢谢
更新
好的,我略微修改了诺西拉的答案,现在正在做我想要的事情:
Log logs = null;
return session.QueryOver<Job>()
.Left.JoinAlias(x => x.Logs, () => logs)
.Where(x => logs.Id == null)
.List<Job>();
Run Code Online (Sandbox Code Playgroud)
我还必须将此添加到我的Job映射中:
<bag …Run Code Online (Sandbox Code Playgroud) 我想知道SQL中的这个语句实际上是做什么的:
select *
from table
where A (+)= B
Run Code Online (Sandbox Code Playgroud)
我反对:
select *
from table
where A = B
Run Code Online (Sandbox Code Playgroud)
并看到了差异,但不知道如何形成关于(+)=的功能的解释.在我看来,(+)=告诉它使其满足条件A = B可用,如果组件不可用则忽略/输入为"空".
此外,此语句在create view语句中运行.
提前致谢.
这个简单的SQL外连接有什么问题?
select count(*) from A -- 25766
select count(*) from B -- 1242
select count(*) from A left outer join B on A.b = B.b -- 310176
Run Code Online (Sandbox Code Playgroud)
分别返回25766,1242和310176行.(这适用于Microsoft SQL Server 2012.)如何A left outer join B返回比存在更多的行A,特别是在这个维恩图的情况下?我想我犯的是一个愚蠢的错误但它是什么?
我需要FULL OUTER JOIN多个表。我知道如何FULL OUTER JOIN从这里到两张桌子。但是我有几张表,我无法将其应用于它们。我怎样才能实现它?
我的SQL代码如下:
INSERT INTO table
(
customer_id
,g01
,g02
,g03
,has_card
,activity
)
SELECT sgd.customer_id, sgd.g01,sgd.g02,sgd.g03,sc.value, a.activity
FROM s_geo_data sgd
LEFT JOIN s_category sc
ON sc.customer_id = sgd.customer_id
UNION
SELECT sgd.customer_id, sgd.g01,sgd.g02,sgd.g03,sc.value, a.activity
FROM s_geo_data sgd
RIGHT JOIN s_category sc
ON sc.customer_id = sgd.customer_id
UNION
SELECT sgd.customer_id, sgd.g01,sgd.g02,sgd.g03,sc.value, a.activity
FROM s_geo_data sgd
LEFT JOIN s_activity a
ON a.customer_id = sgd.customer_id
UNION
SELECT sgd.customer_id, sgd.g01,sgd.g02,sgd.g03,sc.value, a.activity
FROM s_geo_data sgd …Run Code Online (Sandbox Code Playgroud) 我正在使用ruby '2.3.0'和'rails', '3.2.22.2'.
我需要一些关于我所做查询的帮助和解释.这是我的模特:
class AssessmentRaw < ActiveRecord::Base
belongs_to :session
has_many :schedulers, :class_name => 'MailingScheduler', :as => :owner, :dependent => :destroy
end
class MailingScheduler < ActiveRecord::Base
belongs_to :owner, :polymorphic => true
end
class Session < ActiveRecord::Base
has_many :assessment_raws, :dependent => :destroy
end
Run Code Online (Sandbox Code Playgroud)
我想检索所有的assessment_raws,并急切加载关联的会话和mailing_schedulers.
ars = AssessmentRaw.includes(:session).where("sessions.start_at >= ?", 1.year.ago).limit(10)
ars.map { |ar| ar.session.id }
=> [2877,2878,2879,2888,2881,2882,2883,2884,2902,2903]
`ars.map { |ar| ar.schedulers.try(:size) }`
MailingScheduler Load (0.6ms) SELECT "mailing_schedulers".* FROM "mailing_schedulers" WHERE "mailing_schedulers"."owner_id" = 622 AND "mailing_schedulers"."owner_type" = …Run Code Online (Sandbox Code Playgroud) 您好,我需要将一些时间序列数据与最近的时间戳对齐,所以我认为pandas.merge_asof可能是一个很好的候选者。但是,它没有how='outer'像标准merge方法那样设置的选项。
一个例子可以是:
df1:
Value1
Time
2020-07-17 14:25:03.535906075 108
2020-07-17 14:25:05.457247019 110
2020-07-17 14:25:07.467777014 126
Run Code Online (Sandbox Code Playgroud)
df2:
Value2
Time
2020-07-17 14:25:03.535018921 222
2020-07-17 14:25:04.545104980 150
2020-07-17 14:25:07.476825953 60
Run Code Online (Sandbox Code Playgroud)
例如,执行以下操作merge_asof:
pd.merge_asof(df1, df2, left_index=True, right_index=True, direction='nearest', tolerance=pd.Timedelta('0.3s'))
Run Code Online (Sandbox Code Playgroud)
结果将是:
Value1 Value2
Time
2020-07-17 14:25:03.535906075 108 222.0
2020-07-17 14:25:05.457247019 110 NaN
2020-07-17 14:25:07.467777014 126 60.0
Run Code Online (Sandbox Code Playgroud)
但我想要的是:
Value1 Value2
Time
2020-07-17 14:25:03.535906075 108 222.0
2020-07-17 14:25:04.545104980 NaN 150.0 <---- this is the difference
2020-07-17 14:25:05.457247019 110 NaN
2020-07-17 14:25:07.467777014 …Run Code Online (Sandbox Code Playgroud) outer-join ×10
join ×3
sql ×3
left-join ×2
oracle ×2
activerecord ×1
arel ×1
data.table ×1
database ×1
dataframe ×1
haskell ×1
matrix ×1
merge ×1
mysql ×1
nhibernate ×1
pandas ×1
python ×1
r ×1
sql-server ×1
zip ×1