sql join问题

时间:2011-03-28 14:12:12

标签: sql join duplicates

HY!
我有2张桌子。结构如上:

 idStudent     name    age    job     code
 1      john    18     student        1
 2      john    19     programmer     1
 3      john    18     developer      2
 4      mark    18     student        3
 5      mark    19     programmer     1

的相关信息

id     address    tel     code
1      fdsf      00232    1 
2       gffdfd    322     1
 3      dsdd     1833     2 
 4      gffg     43333    3
 5      fff      1933    1

我想获得一个结构表:

   idStudent     name    age    address   tel   code
   1             john    18                     1
   3             john    18                     2
   4              mark    18                   3   

所以我想要做的是获取一个包含唯一代码的表,以及所有其他字段要填充表中出现的第一个或最后一个(对我来说并不重要)数据。我不希望有重复的代码字段,这对我很重要。

2 个答案:

答案 0 :(得分:1)

select S.IdStudent, MIN(Name) Name, MIN(Age) Age, MIN(Address) Address, MIN(Tel) Tel, MIN(Code) Code
FROM Students S Inner Join Info I  ON S.IDStudent = I.Id
group by S.IdStudent

答案 1 :(得分:0)

如果您只想获得每个学生的每个表中的信息,这是一个简单的JOIN查询:

SELECT e.idStudent, e.name, e.age, i.address, i.tel, e.code
FROM students e
INNER JOIN infos i ON e.idEstudent=i.id 

如果您有重复的信息,可以使用GROUP BY clausule获取分组的信息,使用MIN或MAX获取您未分组的每个字段的值。

已编辑以考虑user599977的评论:

从您的评论中我想象您在信息中有重复的行?如果是这样的话,您可以执行以下操作:

SELECT e.idStudent, max(e.name), max(e.age), max(i.address), max(i.tel), max(e.code)
FROM students e
INNER JOIN infos i ON e.idEstudent=i.id
GROUP BY e.idStudent

但是我会建议你过滤一些更可预测的字段,比如上次介绍的记录或类似的东西。

例如:

SELECT e.idStudent, e.name, e.age, i.address, i.tel, e.code
FROM students e
INNER JOIN infos i ON e.idEstudent=i.id
WHERE i.loadDate= (
    SELECT max(loadDate)
    FROM infos
    WHERE id=e.idStudent
)

假设您有一些带有时间戳的列或某些数据允许您确定哪一行是用户输入的最后一行。