SQL Cartesian product

时间:2018-06-25 19:44:09

标签: sql

screenshot

以上结果来自下面的第二个联接操作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中。有什么方法可以避免交叉连接?

任何帮助表示赞赏

3 个答案:

答案 0 :(得分:0)

我会尝试以下方法。

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主键字段一样,您需要将它们全部联接在一起。如果其中一个表缺少数据,则可能需要考虑检查数据,并确保正确设置了键/表/元组。

答案 1 :(得分:0)

谢谢大家的帮助。问题是我错过了配对密钥,这就是为什么结果很奇怪的原因。

答案 2 :(得分:0)

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

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