【问题标题】:sql join two tables, with non repeating resultssql连接两个表,结果不重复
【发布时间】:2025-12-07 16:55:02
【问题描述】:

我有两张桌子

tbl_a

VBID   |   KBID   |   SEQ
 4     |    5     |    1
 4     |    6     |    2
 5     |    6     |    1
 5     |    8     |    2

tbl_b

VBID   |    more columns to be used
 4     |        bar
 5     |        foo

到目前为止我得到的是

SELECT 
   tbl_b.VBID, 
   tbl_a_a.KBID, 
   tbl_a_b.KBID
FROM (tbl_b 
       INNER JOIN tbl_a AS tbl_a_a ON tbl_b.VBID = tbl_a_a.VBID) 
       INNER JOIN tbl_a AS tbl_a_b ON tbl_b.VBID = tbl_a_b.VBID 
WHERE tbl_a_a.KBID <> tbl_a_b.KBID;

我得到的结果是

VBID   |   tbl_a_a.KBID   | tbl_a_b.KBID
 4     |        6         |      5
 4     |        5         |      6                <-- do not need this

我不需要第二行(或第一行),因为它代表相同的数据,我必须在查询中更改什么才能只接收 1 行 更复杂的是我使用的是 ACCESS

【问题讨论】:

    标签: sql ms-access join


    【解决方案1】:

    如果你想要哪个都没关系:

    SELECT t.VBID,MAX(t.KBID),MAX(t.SEQ)
    FROM tbl_a t
    JOIN tbl_b s
     ON(t.vbid = s.vbid)
    GROUP BY t.vbid
    

    【讨论】:

    • 但这并没有给我想要的结果,我需要两个 kbid 都在 tbl_a 中以两行表示为查询中的两列
    【解决方案2】:

    添加一个条件

    SELECT 
       tbl_b.VBID, 
       tbl_a_a.KBID, 
       tbl_a_b.KBID
    FROM (tbl_b 
           INNER JOIN tbl_a AS tbl_a_a ON tbl_b.VBID = tbl_a_a.VBID) 
           INNER JOIN tbl_a AS tbl_a_b ON tbl_b.VBID = tbl_a_b.VBID 
    WHERE tbl_a_a.KBID < tbl_a_b.KBID;
    

    【讨论】:

      【解决方案3】:

      将您的 WHERE 子句更改为:

      WHERE tbl_a_a.KBID < tbl_a_b.KBID;
      

      【讨论】: