我在XML数据集中有两个表.T1,T2.每个表都有一个ID列.
T1有一个客户列表T2有一个订单列表
我想构建一个LINQ查询,它只返回没有订单的客户的ID.换句话说,T2表中不存在客户ID.
哦,是的,我正在使用C#
谢谢!
有人可以告诉我,为什么Linq to Entities会将多个关系转换为1个关系left outer join而不是inner join?因为对DB本身存在引用约束以确保在右表中有记录,所以inner join应该使用它(并且它将更快地工作)
如果关系很多,那么0..1 left outer join就是正确的.
是否有可能以某种方式编写LINQ,因此它将转换为inner join而不是left outer join.它会大大加快查询执行速度......我以前没有使用过eSQL,但在这种情况下使用它会是明智的吗?它会解决我的问题吗?
我更新了我的标签,以包含我在后台使用的技术:
如果有人可以测试在Microsoft SQL服务器上是否也是如此,如果这是Devart的问题或者它是一般的L2EF功能,它也会给我一些见解......但我怀疑EF是罪魁祸首.
我不确定如何描述我的表格结构,所以希望这是有道理的......
我有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) 我一直试图通过我的查询来追踪问题.查询实际上是由HQL从HQL生成的,但生成的SQL没有达到我的预期.稍微修改SQL会产生正确的结果,但我不确定为什么修改应该有所不同.
原始查询(不返回任何行)
select sched.id, max(txn.dttm), acc.id
from PaymentSchedulePeriod sched
cross join PaymentSchedulePayment pay
right outer join AccountTransaction txn on pay.accountTransactionFk=txn.id
right outer join Account acc on txn.accountFk=acc.id
where sched.accountFk=acc.id
group by sched.id, acc.id
Run Code Online (Sandbox Code Playgroud)
修改后的查询 - 用逗号替换交叉连接(隐式交叉连接)
返回一行
select sched.id, max(txn.dttm), acc.id
from PaymentSchedulePeriod sched
,PaymentSchedulePayment pay
right outer join AccountTransaction txn on pay.accountTransactionFk=txn.id
right outer join Account acc on txn.accountFk=acc.id
where sched.accountFk=acc.id
group by sched.id, acc.id
Run Code Online (Sandbox Code Playgroud)
我的理解可能是不正确的,写作from Table1 a, Table2 b与写作是一样的from Table 1 a cross join Table2 …
关于linq-to-sql我有一个奇怪的问题,我真的试过搜索它.我正在设计一个sql数据库,最近刚尝试从中检索一个对象.
问题在于多个连接.我的所有表都使用identity-columns作为主键.
Db设计如下:
MasterTable:Id(主键,标识列,int),MasterColumn1(nvarchar(50))
Slave1:Id(主键,标识列,int),MasterId(int,主键 - > MasterTable Id),SlaveCol1
Slave2:Id(主键,标识列,int),MasterId(int,主键 - > MasterTable Id),SlaveColumn2
使用的代码:
var db = new TestDbDataContext() { Log = Console.Out };
var res = from f in db.MasterTables
where f.MasterColumn1 == "wtf"
select new
{
f.Id,
SlaveCols1 = f.Slave1s.Select(s => s.SlaveCol1),
SlaveCols2 = f.Slave2s.Select(s => s.SlaveColumn2)
};
foreach (var re in res)
{
Console.Out.WriteLine(
re.Id + " "
+ string.Join(", ", re.SlaveCols1.ToArray()) + " "
+ string.Join(", ", re.SlaveCols2.ToArray())
);
}
Run Code Online (Sandbox Code Playgroud)
日志是:
SELECT [t0].[Id], [t1].[SlaveCol1], ( …Run Code Online (Sandbox Code Playgroud) 给定每个维度的p向量,计算其张量/外部/ Kruskal产品的最佳方法是什么(带有条目的-array X ?循环是微不足道的,但是很愚蠢.使用重复调用可以正常工作,但似乎不是最佳解决方案(显然,随着p增加,速度会变慢).有更好的方法吗?x1,x2,...,xpdpX[i1,i2,..ip] = x1[i1]x2[i2]...xp[ip])outer
编辑:
我目前最好的是
array(apply(expand.grid(x1, x2, x3), 1, prod), dim=rep(d, 3))
Run Code Online (Sandbox Code Playgroud)
至少"感觉更好"......
编辑2:回应@Dwin,这是一个完整的例子
d=3
x1 = 1:d
x2 = 1:d+3
x3 = 1:d+6
array(apply(expand.grid(x1, x2, x3), 1, prod), dim=rep(d, 3))
, , 1
[,1] [,2] [,3]
[1,] 28 35 42
[2,] 56 70 84
[3,] 84 105 126
, , 2
[,1] [,2] [,3]
[1,] 32 40 48
[2,] 64 80 96
[3,] 96 120 144
, …Run Code Online (Sandbox Code Playgroud) 在填充的data.table和另一个为空的data.table之间进行合并会在结果data.table中引入一个NA行:
a = data.table(c=c(1,2),key='c')
b = data.table(c=3,key='c')
b=b[c!=3]
b
# Empty data.table (0 rows) of 1 col: c
merge(a,b,all=T)
# c
# 1: NA
# 2: 1
# 3: 2
Run Code Online (Sandbox Code Playgroud)
为什么?我希望它只返回data.table行a,就像merge.data.frame一样:
> merge.data.frame(a,b,all=T,by='c')
# c
#1 1
#2 2
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) 我想合并2个数据帧与广播关系:没有公共索引,只想找到2个数据帧中的所有行对.所以想要使N行数据帧x M行dataframe = N*M行数据帧.有没有规则可以在不使用itertool的情况下实现这一目标?
DF1=
id quantity
0 1 20
1 2 23
DF2=
name part
0 'A' 3
1 'B' 4
2 'C' 5
DF_merged=
id quantity name part
0 1 20 'A' 3
1 1 20 'B' 4
2 1 20 'C' 5
3 2 23 'A' 3
4 2 23 'B' 4
5 2 23 'C' 5
Run Code Online (Sandbox Code Playgroud) outer-join ×10
r ×3
c# ×2
data.table ×2
sql ×2
broadcast ×1
cross-join ×1
devart ×1
dotconnect ×1
inner-join ×1
linq-to-sql ×1
linq-to-xml ×1
matrix ×1
merge ×1
mysql ×1
oracle ×1
pandas ×1
python ×1
sql-server ×1