目前,我无法使用典型的数据库,因此暂时使用excel.有任何想法吗?
该
今天,在使用sql server进行10年开发的第一次中,我在生产查询中使用了交叉连接.我需要将结果集填充到报表中,并发现具有creative where子句的两个表之间的交叉连接是一个很好的解决方案.我想知道在交叉连接的生产代码中有什么用处?
更新:托尼安德鲁斯发布的代码非常接近我使用交叉联接的代码.相信我,我理解使用交叉连接的含义,并不会轻易做到这一点.我很高兴最终使用它(我是一个书呆子) - 有点像我第一次使用完全外连接的时候.
感谢大家的答案!这是我使用交叉连接的方式:
SELECT CLASS, [Trans-Date] as Trans_Date,
SUM(CASE TRANS
WHEN 'SCR' THEN [Std-Labor-Value]
WHEN 'S+' THEN [Std-Labor-Value]
WHEN 'S-' THEN [Std-Labor-Value]
WHEN 'SAL' THEN [Std-Labor-Value]
WHEN 'OUT' THEN [Std-Labor-Value]
ELSE 0
END) AS [LABOR SCRAP],
SUM(CASE TRANS
WHEN 'SCR' THEN [Std-Material-Value]
WHEN 'S+' THEN [Std-Material-Value]
WHEN 'S-' THEN [Std-Material-Value]
WHEN 'SAL' THEN [Std-Material-Value]
ELSE 0
END) AS [MATERIAL SCRAP],
SUM(CASE TRANS WHEN 'RWK' THEN [Act-Labor-Value] ELSE 0 END) AS [LABOR REWORK],
SUM(CASE TRANS
WHEN 'PRD' …
Run Code Online (Sandbox Code Playgroud) Baur&King在他们的书中说:
隐式连接始终沿着多对一或一对一关联,而不是通过集合值关联.
[P 646,Ch 14]
但是当我在代码中执行此操作时,它会生成CROSS JOIN而不是INNER JOIN.
映射来自Member2
(多对一) - > CLub
.
但Club2
没有关于会员的信息,并且Member2
拥有Club2的外键.
我的疑问是
// Implicit: Find all UK club member who is female
Transaction t1 = HibernateUtil.begin();
Query query =
HibernateUtil.getSession().createQuery("From Member2 m where m.club2.country = 'UK' ");
List<Member2> memList = query.list();
for (Member2 m : memList)
System.out.println(m);
HibernateUtil.end(t1);
Run Code Online (Sandbox Code Playgroud)
并且,Hibernate生成以下SQL查询:
Hibernate:
select
member2x0_.member_id as member_i1_1_,
member2x0_.club_id as club_id5_1_,
member2x0_.member_age as member_a2_1_,
member2x0_.member_name as member_n3_1_,
member2x0_.member_sex as member_s4_1_
from
TBL_MEMBER2 member2x0_ cross
join …
Run Code Online (Sandbox Code Playgroud) 如果有这样的数据:
A = LOAD 'data' AS (a1:int,a2:int,a3:int);
DUMP A;
(1,2,3)
(4,2,1)
Run Code Online (Sandbox Code Playgroud)
然后在A,A上完成交叉连接:
B = CROSS A, A;
DUMP B;
(1,2,3)
(4,2,1)
Run Code Online (Sandbox Code Playgroud)
为什么第二个A从查询中优化出来?
信息:猪版0.11
==更新==
如果我按A排序:
C = ORDER A BY a1;
D = CROSS A, C;
Run Code Online (Sandbox Code Playgroud)
它将提供正确的交叉连接.
我遇到Hibernate生成无效SQL的问题.具体来说,混合和匹配隐式和显式连接.这似乎是一个开放的bug.
但是,我不确定为什么这是无效的SQL.我想出了一个生成相同语法异常的小玩具示例.
CREATE TABLE Employee (
employeeID INT,
name VARCHAR(255),
managerEmployeeID INT
)
Run Code Online (Sandbox Code Playgroud)
INSERT INTO Employee (employeeID, name) VALUES (1, 'Gary')
INSERT INTO Employee (employeeID, name, managerEmployeeID) VALUES (2, 'Bob', 1)
Run Code Online (Sandbox Code Playgroud)
这两个查询都有效.我意识到有笛卡尔积; 那是故意的.
明确的加入:
SELECT e1.name,
e2.name,
e1Manager.name
FROM Employee e1
CROSS JOIN Employee e2
INNER JOIN Employee e1Manager
ON e1.managerEmployeeID = e1Manager.employeeID
Run Code Online (Sandbox Code Playgroud)
隐含的JOIN:
SELECT e1.name,
e2.name,
e1Manager.name
FROM Employee e1,
Employee e2,
Employee e1Manager
WHERE e1.managerEmployeeID = e1Manager.employeeID
Run Code Online (Sandbox Code Playgroud)
此查询不适用于MSSQL 2000/2008或MySQL:
SELECT …
Run Code Online (Sandbox Code Playgroud) 我正在尝试进行交叉连接(来自此处的原始问题),并且我有 500GB 的内存。问题是最后的data.table
行数超过 2^31 行,所以我收到此错误:
Error in vecseq(f__, len__, if (allow.cartesian || notjoin || !anyDuplicated(f__, :
Join results in more than 2^31 rows (internal vecseq reached physical limit). Very likely misspecified join. Check for duplicate key values in i each of which join to the same group in x over and over again. If that's ok, try by=.EACHI to run j for each group to avoid the large allocation. Otherwise, please search for this error message …
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 …
有什么区别:
select t1.a1, t1.a2, t1.a3 from t1 cross join t2 where t1.a3 = t2.a1
Run Code Online (Sandbox Code Playgroud)
和:
select t1.a1, t1.a2, t1.a3 from t1,t2 where t1.a3=t2.a1;
Run Code Online (Sandbox Code Playgroud)
我可以互换使用吗?
我有一个data.table
对象,其中包含多个指定唯一案例的列.在下面的小示例中,变量" name
"," job
"和" sex
"指定唯一ID.我想添加缺失的行,以便每个case都有一行用于另一个变量的每个可能实例," from
"(类似于expand.grid
).
library(data.table)
set.seed(1)
mydata <- data.table(name = c("john","john","john","john","mary","chris","chris","chris"),
job = c("teacher","teacher","teacher","teacher","police","lawyer","lawyer","doctor"),
sex = c("male","male","male","male","female","female","male","male"),
from = c("NYT","USAT","BG","TIME","USAT","BG","NYT","NYT"),
score = rnorm(8))
setkeyv(mydata, cols=c("name","job","sex"))
mydata[CJ(unique(name, job, sex), unique(from))]
Run Code Online (Sandbox Code Playgroud)
这是当前的data.table对象:
> mydata
name job sex from score
1: john teacher male NYT -0.6264538
2: john teacher male USAT 0.1836433
3: john teacher male BG -0.8356286
4: john teacher male TIME 1.5952808
5: mary police female USAT 0.3295078
6: chris lawyer female …
Run Code Online (Sandbox Code Playgroud) 简介:我见过的MDX连接的大多数示例都涉及加入相对较小的集合,例如每个集合数十或数百个项目.但我发现自己也想尝试加入(特别是"非空加入")集合,每个集合包含数千或数万个项目,到目前为止它还不能正常运行.我想知道这是否可以使用,或者我是否需要考虑使用除Mondrian/OLAP之外的其他东西.
具体来说,我有一个记录公司(n = 7000)和客户(n = 27000)之间互动的立方体.目前公司和客户都是完全扁平化的层次结构; 有所有级别和个人 - 公司级别,其间没有其他级别.有一个中央事实表,以及公司和客户的单独维度表.
我的用户至少似乎想要沿着这些方向获取摘要报告,聚合公司和客户之间的所有非空交互:
select
[Measures].[Amount] on columns,
NonEmptyCrossJoin([Firm].Children,
[Client].Children) on rows
from MyCube
Run Code Online (Sandbox Code Playgroud)
但是这个查询及其变体在我的测试Mondrian设置中不起作用.要么我得到一个OutOfMemoryException(在2GB的Java堆上),要么Java似乎花了不可思议的长时间在mondrian.rolap.RolapResult $ AxisMember.mergeTuple(TupleCursor).(如果有帮助的话,我可以提供更完整的堆栈跟踪.)"不可思议的长"我的意思是Java在我放弃之前会在数小时内停留在查询中.
我最初的预期上面的查询进行确定,因为从概念上讲它可以做一定程度的只是在做沿着这些路线的SQL查询有效:
select Firm, Client, Sum(Amount) as n
from fact, firm, client
where fact.firmid = firm.firmid and fact.clientid = client.clientid
group by Firm, Client
Run Code Online (Sandbox Code Playgroud)
(事实上,如果我直接在MySql中执行这样的操作,则执行时间不会超过15秒.)
但是从调试日志来看,Mondrian似乎没有尝试这种优化.相反,它似乎是在内部进行连接,并且最终变得特别慢.我在我的mondrian.properties中设置了mondrian.native.crossjoin.enable = true,但这似乎不是Mondrian能够"生成本机"的连接类型之一.(如果我打开mondrian.native.unsupported.alert = ERROR,那么我得到相应的异常.)
我想知道我是否需要阻止我的用户尝试加入如此大的尺寸/集合,或者Mondrian是否可能不是我在这里寻找的工具.但也许我只是做错了什么.
cross-join ×10
sql ×5
join ×4
database ×3
data.table ×2
hibernate ×2
merge ×2
r ×2
sql-server ×2
apache-arrow ×1
apache-pig ×1
excel ×1
java ×1
mondrian ×1
mysql ×1
olap ×1
outer-join ×1
t-sql ×1