不正确的记录数(连接和笛卡尔) - SQL

时间:2016-09-20 15:06:47

标签: sql sql-server join outer-join cartesian-product

我正在运行SSMS并尝试编写一个查询来返回一个大表单,该表单从各个表中捕获所有数据,用于"完整市场"分析。但是,我得到的数据太少或太多了。

我最大的表有1,025,650行。我做了这个号码

SELECT DISTINCT
    dbo.PUBACC_EN.unique_system_identifier, dbo.PUBACC_EN.call_sign, 
    dbo.PUBACC_EN.email, dbo.PUBACC_EN.phone,   
    dbo.PUBACC_EN.first_name,dbo.PUBACC_EN.last_name, 
    dbo.PUBACC_EN.entity_name, dbo.PUBACC_EN.state, 
    dbo.PUBACC_HD.radio_service_code,
    dbo.PUBACC_HD.grant_date, dbo.PUBACC_HD.last_action_date, 
    dbo.PUBACC_HD.expired_date,
    dbo.PUBACC_HD.effective_date, dbo.PUBACC_BF.buildout_date, 
    dbo.PUBACC_FR.transmitter_make, 
    dbo.PUBACC_FR.transmitter_model, dbo.PUBACC_FR.frequency_assigned,
    dbo.PUBACC_LO.lat_degrees, dbo.PUBACC_LO.lat_minutes, 
    dbo.PUBACC_LO.lat_seconds, 
    dbo.PUBACC_LO.lat_direction, dbo.PUBACC_LO.long_degrees, 
    dbo.PUBACC_LO.long_minutes, 
    dbo.PUBACC_LO.long_seconds, dbo.PUBACC_LO.long_direction 
FROM 
    dbo.PUBACC_EN
LEFT OUTER JOIN 
    dbo.PUBACC_HD ON dbo.PUBACC_EN.unique_system_identifier = dbo.PUBACC_HD.unique_system_identifier 
LEFT OUTER JOIN 
    dbo.PUBACC_FR ON dbo.PUBACC_EN.unique_system_identifier = dbo.PUBACC_FR.unique_system_identifier
LEFT OUTER JOIN 
    dbo.PUBACC_LO ON dbo.PUBACC_EN.unique_system_identifier = dbo.PUBACC_LO.unique_system_identifier
LEFT OUTER JOIN 
    dbo.PUBACC_BF ON dbo.PUBACC_EN.unique_system_identifier = dbo.PUBACC_BF.unique_system_identifier
LEFT OUTER JOIN 
    dbo.PUBACC_PA ON dbo.PUBACC_EN.unique_system_identifier = dbo.PUBACC_PA.unique_system_identifier

在我的所有桌子上。这是最大的数字。

我想要的是:如上所述,我想要的结果可能是1,025,650行,其中多列来自各种表格。

我尝试了什么:(对不起大块)

SELECT DISTINCT
    dbo.PUBACC_HD.radio_service_code, dbo.PUBACC_FR.transmitter_make, 
    dbo.PUBACC_LO.lat_degrees, dbo.PUBACC_LO.lat_minutes, dbo.PUBACC_LO.lat_seconds, 
    dbo.PUBACC_LO.lat_direction, dbo.PUBACC_LO.long_degrees, dbo.PUBACC_LO.long_minutes, 
    dbo.PUBACC_LO.long_seconds, dbo.PUBACC_LO.long_direction 
FROM 
    dbo.PUBACC_EN
LEFT OUTER JOIN 
    dbo.PUBACC_HD ON dbo.PUBACC_EN.unique_system_identifier = dbo.PUBACC_HD.unique_system_identifier 
LEFT OUTER JOIN 
    dbo.PUBACC_FR ON dbo.PUBACC_EN.unique_system_identifier = dbo.PUBACC_FR.unique_system_identifier
LEFT OUTER JOIN 
    dbo.PUBACC_LO ON dbo.PUBACC_EN.unique_system_identifier = dbo.PUBACC_LO.unique_system_identifier

上面的代码返回9,931,904行。

然后我尝试了一个较小的查询:

mvn archetype:generate -Dfilter=org.example.group:example-artifact

这只返回了421,432行。

我的问题和TL; DR:**

我想我得到http://docs.scipy.org/doc/scipy/reference/generated/scipy.sparse.csr_matrix.html或者我的加入不正确。什么是我的问题的解决方案?

3 个答案:

答案 0 :(得分:1)

很明显,某些表中的某些unique_system_identifier值有多个值。如果这是一个惊喜,你将不得不深入研究各个表,以找出倍数的来源。您可以在每个表上运行这样的查询以查看倍数:

;with cte AS (SELECT * 
                     ,COUNT(*) OVER(PARTITION BY unique_system_identifier) AS CT
              FROM DBO.PUBACC_HD
             )
SELECT *
FROM cte
WHERE CT > 1
ORDER BY CT DESC, unique_system_identifier 

解决方法是删除意外的倍数或更改您的加入条件以确保1:1加入。

答案 1 :(得分:0)

您的一个表中有多个行(并且肯定在其中一个PUBACC_BF PUBACC_PA表中),在“unique_system_identifier”字段中具有相同的值。

你也想停止使用“distinct”,因为它会隐藏真正的笛卡尔,从而隐藏查询中的错误。

答案 2 :(得分:0)

如果您的最大行数应该是最大涉及表的行数,我认为您的查询应该使用inner join来完成。至少你的描述听起来像这样。可能还需要使用distinct子句约束您的结果。