无法获得加入两个表的唯一值
Posted
技术标签:
【中文标题】无法获得加入两个表的唯一值【英文标题】:Can't get unique values joining two tables 【发布时间】:2012-03-09 15:50:32 【问题描述】:我有 2 个表需要加入并从中选择唯一行。这是我的数据示例:(还有更多列)
tbl1:
MB# MBName PCCNo_PRI Primary_IP PCCNo_SEC Secondary_IP ID
100 name 0 10.1.9.10 30 10.1.9.10 1
103 name3 17 10.1.9.27 47 10.1.9.67 4
403 name13 17 10.1.9.27 47 10.1.9.67 14
tbl2:
RTU PCC#_PRI PCC#_SEC STATION ADDRESS
15 0 30 6
52 12 42 1
53* 17 47 1
54 18 48 1
63 9 39 2
69* 17 47 2
我需要连接这两个表,并为 tbl1 中的给定 MB# 获取 tbl2 中的唯一 RTU。 查询 =
SELECT t1.MB#,t2.RTU,t2.[Device Manufacturer],t2.PCC#_PRI,t2.PCC#_SEC,t2.[STATION ADDRESS]
INTO C300_RTU_MASTERBLK_Map
FROM mbm_PCDIMasterBlk_tbl as t1, dbo.WOA_PCC_Conn_tbl as t2
WHERE t1.PCCNo_PRI = t2.PCC#_PRI
我得到 tbl2 53 和 69 的重复行(* 以上)。 53 最终有 2 个条目;一个到 103 和一个 403(69 得到相同)。如何查询此内容以获得 MB# 的唯一 RTU?
【问题讨论】:
你能发布你的结果吗?你如何决定你需要哪一行。对于 ex for pccNo_pri = 17,您需要 53 还是 69 中的哪一个?逻辑是什么? 如果你想要RTU
和MB#
的完整组合,那么你的结果是正确的。您的结果将是 (RTU
, `PCCNo_PRI', 'MB#') : (53, 17, 103), (53, 17, 403), (69, 17, 103), (69, 17, 403) .由于您的数据清楚地包含相同 RTU 适用于多个 MB# 的组合,您的实际问题是什么,您将如何确定哪些行是“错误的”?
好问题。我想你暴露了我的问题。我知道它应该是什么,但在你们指出之前我看不到我的缺陷。让我看看我能不能重做一张桌子。
结果应该是:53 -> 103(仅限)& 69 -> 403(仅限)
【参考方案1】:
出现重复行是因为您加入“17”,每边有 2 行
那么,就目前而言,您不能使用该 SELECT 列表。
您如何决定要为 t2 列使用哪个 t1.MB#
?
我看不到辅助 JOIN 列。 所以你能得到的最好的方法是使用 MAX(或 MIN)来选择 403 或 103。
SELECT
MAX(t1.MB#) AS MB#,
t2.RTU,t2.[Device Manufacturer],t2.PCC#_PRI,t2.PCC#_SEC,t2.[STATION ADDRESS]
INTO C300_RTU_MASTERBLK_Map
FROM
dbombm_PCDIMasterBlk_tbl as t1
JOIN
dbo.WOA_PCC_Conn_tbl as t2 ON t1.PCCNo_PRI = t2.PCC#_PRI
GROUP BY
t2.RTU,t2.[Device Manufacturer],t2.PCC#_PRI,t2.PCC#_SEC,t2.[STATION ADDRESS]
【讨论】:
好的代码,它消除了重复但没有给出正确的结果。 53 和 69 被分配给 MB#403。 53 应该转到 103 和 69 到 403。我看到有关如何确定结果应该是什么的问题。在试图回答这个问题时,我意识到实际上 53 只会被分配给 103,因为行处理的顺序而不是因为任何逻辑分配。 这就是答案。我回去修复了 tbl1(在我填充数据的方式中发现了一个错误),然后这个查询就起作用了。谢谢gbn。以上是关于无法获得加入两个表的唯一值的主要内容,如果未能解决你的问题,请参考以下文章