【问题标题】:SQL Cartesian productSQL 笛卡尔积
【发布时间】:2018-06-25 19:44:09
【问题描述】:

上面的结果是下面的第二个join操作,FactPayTransaction和 分别为FactPairingSegments

我有两个事实表 - FactPairingSegmentsFactPayTransactions

我正在对这两个执行如下连接:

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


【解决方案1】:

我会尝试以下方法。

SELECT ps.Bidperiod
,ps.PairingNumber
,ps.ActBlockMin
,ps.ActCreditMin
,ps.ActDeadHeadMin
,pt.EmployeeKey
,pt.TransactionKey
,pt.PayCreditMin
,pt.Comment
FROM FactPayTransaction pt
LEFT JOIN FactPairingSegments ps ON ps.Bidperiod        = pt.BidPeriod
                                AND ps.PairingDateKey   = pt.PairingDateKey
                                AND ps.PairingNumber    = pt.PairingNumber
                                AND pt.pairinglegnumber = ps.PairingLegNumber;

事实表通常很奇怪,因为它们具有像 gajilion 主键字段一样,您需要加入所有这些字段。如果您的某个表缺少数据,您可能需要考虑检查数据并确保您的键/表/元组设置正确。

【讨论】:

    【解决方案2】:

    谢谢你们的帮助,伙计们。问题是我错过了配对密钥,这就是结果奇怪的原因。

    【讨论】:

    • 您能否在此答案中添加更多内容。也许是一个代码片段,显示了您为纠正错误所做的工作?
    【解决方案3】:

    我在加入条件中添加了航空公司密钥:

    SELECT ps.Bidperiod
    ,ps.PairingNumber
    ,ps.ActBlockMin
    ,ps.ActCreditMin
    ,ps.ActDeadHeadMin
    ,pt.EmployeeKey
    ,pt.TransactionKey
    ,pt.PayCreditMin
    ,pt.Comment
    FROM FactPayTransaction pt
    LEFT JOIN FactPairingSegments ps ON ps.Bidperiod        = pt.BidPeriod
                                    AND ps.PairingDateKey   = pt.PairingDateKey
                                    AND ps.PairingNumber    = pt.PairingNumber
                                    AND pt.pairinglegnumber = ps.PairingLegNumber
                                    AND pt.Airlinekey=ps.Airlinekey
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-06
      • 2012-06-24
      相关资源
      最近更新 更多