首页 > 解决方案 > 跨两个表的 SQL 查询仅显示每个标签地址最近更新的结果

问题描述

我有两张桌子:violator_stateviolator_tags

违规者状态:

m_state_id
is_violating
m_translatedid
m_tag
m_violator_tag

该表包含“标签”,在这种情况下,其行数不变为 10。目的是列出每个存在的标签,将完整的标签地址 (m_violator_tag) 与其简写名称 (m_tag) 连接起来,并说明它是否处于“违规”状态。由于 m_violator_tag 和 m_tag 之间的链接,我需要使用此表作为参考。

违规者标签

m_violator_id
m_eval_time_from
m_eval_time_to
m_tag
m_tag_peers
m_tag_position

该表不断添加新行,其中包含哪些标签违反特定标签的信息。所以它会显示 T6 违反了 T1、T2、T9 等。

我正在寻找一个查询,它连接两个表以仅显示每个标签的最近更新(最大的 m_eval_time_from)。

我正在使用以下查询来连接这两个表,但我希望 m_translatedid 和 m_tag 匹配,但它们不匹配。不确定为什么。

SELECT violator_state.m_violator_tag, violator_state.is_violating, violator_state.m_translatedid, violator_tags.m_tag, violator_tags.m_eval_time_to, violator_tags.m_tag_peers, 
                  violator_tags.m_tag_position, violator_tags.m_eval_time_from
FROM     violator_tags CROSS JOIN
                  violator_state

Violation_state 表

违规标签表

我的(不正确的)查询的结果

关于我应该尝试什么的任何建议?

标签: sqlpostgresql

解决方案


您的 CROSS JOIN 将为您提供一个笛卡尔积,其中第一个表中的每一行都与第二个表中的所有行配对,例如,如果每个表中有 10 行,您将得到 10 x 10 = 100 行的结果!我相信您需要加入 m_tag 列上的表格并选择具有最新日期的 violator_tags 行。下面的查询应该为您执行此操作(尽管您没有以一种便于我仔细检查我的代码的方式提供您的问题 - 请参阅a_horse_with_no_name提供的链接以了解更多信息或使用类似 db- 的网站小提琴来设置你的例子)。

SELECT  vs.m_violator_tag, 
        vs.is_violating, 
        vs.m_translatedid, 
        vt.m_tag, 
        vt.m_eval_time_to, 
        vt.m_tag_peers, 
        vt.m_tag_position, 
        vt.m_eval_time_from
  FROM  violator_tags vt
  JOIN  violator_state vs 
    ON  vt.m_tag = vs.m_tag
   AND  vt.m_eval_time_from = (SELECT MAX(vt.m_eval_time_from) 
                                 FROM violator_tags 
                                WHERE m_tag = vt.m_tag)     

推荐阅读