【发布时间】:2017-01-28 14:06:07
【问题描述】:
我正在运行 SSMS 并尝试编写一个查询以返回一个大表,该表从各种表中捕获所有数据以进行“完整市场”分析。但是,我得到的数据要么太少,要么太多。
我最大的表有 1,025,650 行。我通过这样做得到了这个号码
SELECT COUNT(*)
FROM Table_name
在我所有的桌子上。那是最大的数字。
我想要什么:如上所述,我想要的结果可能是包含 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
以上代码返回 9,931,904 行。
然后我尝试了一个较小的查询:
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
这仅返回 421,432 行。
我的问题和 TL;DR :**
我想我收到了 Cartesian Product 或者我的联接不正确。我的问题的解决方案是什么?
【问题讨论】:
-
好吧,至少看起来
unique_system_identifier不是很独特 -
我的意思是,这很容易验证,你应该在每个表格中做一个
COUNT(DISTINCT unique_system_identifier)并将其与COUNT(*)进行比较,看看它们是否是唯一的 -
哇......这很糟糕...... 248,509 个唯一的“唯一系统标识符”......所以可以公平地说,我的问题是基于该领域缺乏唯一性的唯一性吗?
-
@MattR 这不仅仅是公平地说,它是你问题的唯一原因
-
@HartCO... 刚刚联系了我办公室的某个人... 显然这是我们的常见做法,因为我们的产品有多个使用相同标识符和呼号的记录。作为一名分析师,这让我头晕目眩。 - 我应该删除这篇文章,因为“我的”错误无法解决?
标签: sql sql-server join outer-join cartesian-product