在SQLite中,如何进行连接以避免列中的特定重复项

时间:2014-05-04 18:56:24

标签: sqlite join

我正在尝试使用连接从SQLite数据库中提取一组记录,从而避免在一列中出现重复。问题如下:我有两个表,Table_A在Table_B中对同一行有多个“Names”,但我只需要第一个名称(按Table_A.Id排序)。所以,在下面的例子中,我只想在结果中使用Alfa和Gamma。

以下是一个例子:

表_A

   Id      bId     Name
   -----   ------  ----
   1       1       Alfa
   2       1       Beta
   3       2       Gamma
   4       2       Delta

表-B

   Id      Year    Title
   -----   ------  ------
   1       1900    Doctor
   2       1920    Priest

我正在寻找的结果是,

   bId      Name    Year    Title
   ------   ------  -----   ------
   1        Alfa    1900    Doctor
   2        Gamma   1920    Priest

显而易见的联接如下:

Select  bID, Name, Year, Title from Table_A as a join Table_B as b on b.id=a.bid 
order by bId;

返回以下数据,包括我不需要的beta和delta。

   bId     Name    Year    Title
   -----   ------  ------  ------
   1       Alfa    1900    Doctor
   1       Beta    1900    Doctor
   2       Gamma   1920    Priest
   2       Delta   1920    Priest

如果我将查询更改为

Select  bID, Name, Year, Title from Table_A as a join Table_B as b on b.id=a.bid 
group by bId order by bId;

然后我得到类似这样的结果也是错误的(我得到Beta& Delta而不是Alfa& Gamma)

   bId     Name    Year    Title
   -----   ------  ------  ------
   1       Beta    1900    Doctor
   2       Delta   1920    Priest

哪个也不好。

我试图通过查看语法和使用Google来找到如何在SQLite中执行此操作,并且无法找到答案。将不胜感激任何帮助。

2 个答案:

答案 0 :(得分:0)

如果您有SQLite 3.7.11或更高版本,则可以使用MIN或MAX选择返回组中的哪条记录。 在此查询中,将MIN(A.Id)添加到SELECT子句。

答案 1 :(得分:0)

 SELECT bID, Name, Year, Title 
 FROM Table_A AS A INNER JOIN Table_B AS B on B.id = A.bid 
 WHERE NOT EXISTS (SELECT * FROM Table_A WHERE bid = A.bid AND id < A.id)
 ORDER BY bId;

这会过滤结果,仅保留对于相同id值无法找到较低bid值的记录。性能不高,但对于非庞大的表格,它可能足以满足您的需求。

可替换地:

 SELECT bID, Name, Year, Title 
 FROM Table_A AS A INNER JOIN Table_B AS B on B.id = A.bid 
 WHERE id = (SELECT MIN(id) FROM Table_A WHERE bid = A.bid)
 ORDER BY bId;