【发布时间】:2018-06-25 19:44:09
【问题描述】:
上面的结果是下面的第二个join操作,FactPayTransaction和
分别为FactPairingSegments。
我有两个事实表 - FactPairingSegments 和 FactPayTransactions。
我正在对这两个执行如下连接:
SELECT
ps.Bidperiod, ps.PairingNumber,
ps.ActBlockMin, ps.ActCreditMin,
ps.ActDeadHeadMin,
pt.EmployeeKey, pt.TransactionKey, pt.PayCreditMin, pt.Comment
FROM
FactPairingSegments ps,
FactPayTransaction pt
WHERE
ps.Bidperiod = pt.BidPeriod
AND ps.PairingDateKey = pt.PairingDateKey
AND ps.PairingNumber = pt.PairingNumber
AND pt.pairinglegnumber = ps.PairingLegNumber
但是,这将只检索行的子集,因为PayTransaction 表中有很多行具有PairingLegNumber = NULL。
所以我尝试了结合之前的查询:
SELECT
ps.Bidperiod, ps.PairingNumber, ps.pairinglegnumber,
pt.PairingNumber, pt.PairingLegNumber,
ps.ActBlockMin, ps.ActCreditMin, ps.ActDeadHeadMin,
pt.EmployeeKey, pt.TransactionKey, pt.PayCreditMin, pt.Comment
FROM
FactPairingSegments ps,
FactPayTransaction pt
WHERE
ps.Bidperiod = pt.BidPeriod
AND ps.PairingDateKey = pt.PairingDateKey
AND ps.PairingNumber = pt.PairingNumber
AND pt.PairingLegNumber IS NULL
但这会导致笛卡尔积。
我遇到的问题是,FactPairingSegments 表不包含带有 NULL PairingLegNumber 的行。这些行仅存在于PayTransactions 中。有什么办法可以避免交叉连接?
任何帮助表示赞赏
【问题讨论】:
-
我想如果你用
JOIN而不是逗号加入重写,你可能会找到答案。 -
Bad habits to kick : using old-style JOINs - 旧式 逗号分隔的表格列表 样式已替换为 ANSI 中的 proper ANSI
JOIN语法-92 SQL 标准(25 多年前),不鼓励使用它 -
我最初也尝试过使用连接语法,但没有成功。
-
预期结果是什么?您想要哪个表中的所有行?
标签: sql