如何加入多个连接但返回不同的值

时间:2009-06-24 14:14:20

标签: sql join

我正在尝试加入多个表格。 表1具有不同的ID 表2为每个ID SAY 3 NAMES有多个名称 表3每个ID有2个日期

当我加入三个表时,我为每个ID获取了6行数据,每个名称出现两次,每个日期出现三次。

我想只写3行,为每个ID返回不同的3个名称和不同的2个日期。在SQL中使用Joins时有没有办法做到这一点?

8 个答案:

答案 0 :(得分:2)

要在表1中每行获得一个结果行,您必须在其他表上使用分组功能。例如,如果您想要最后一个(按升序排序)名称和日期,则使用

select t1.id,
       max(t2.name),
       max(t3.datefield)
  from table1 t1
  join table2 t2 on t2.id = t1.id
  join table3 t3 on t3.id = t1.id
 group by t1.id
;

答案 1 :(得分:1)

这样的事情怎么样,不使用明确的JOIN s:

SELECT T1.ID
  FROM Table1 AS T1
 WHERE EXISTS (
               SELECT * 
                 FROM Table2 AS T2
                WHERE T2.ID = T1.ID
              )
       AND EXISTS (
                   SELECT * 
                     FROM Table3 AS T3
                    WHERE T3.ID = T1.ID
                  );

答案 2 :(得分:0)

如果使用SELECT DISTINCT在查询前加上,则应仅返回不同的行。

答案 3 :(得分:0)

如果我正确理解了这个问题,你会想要使用GROUP BY子句

http://www.w3schools.com/sql/sql_groupby.asp

答案 4 :(得分:0)

你真的需要了解你想要回归的原因和原因。

请发布您的示例源行和您想要实现的结果(以及原因)。

你获得6行的原因是因为有6种可能与你所说的模型匹配。

如果“太多”,您需要添加一个额外的标准,但尚未说明,以确定哪个日期是您希望使用每个名称显示的日期。

答案 5 :(得分:0)

我认为您需要进行两次查询。

SELECT id, name FROM names WHERE id = 1
SELECT id, date FROM dates WHERE id = 1

听起来你正在尝试做的操作类型并不真正有效,因为结果实际上不是关系。 (你有一列有3行,有一列有2行)

答案 6 :(得分:0)

这是我想要做的事情

表1 ID 401

表2 ID NameType名称 401 Primary Anu1 401 AKA Anu2 401 Maiden Anu3

表3 ID DateType日期 401 DOB 1983-09-25 401 DOD 2008-05-07

我喜欢写我的联接 选择a.ID,b.NameType,b.Name,c.datetype,c.date 从表1 a LEFT JOIN表2 b ON a.ID = b.ID LEFT JOIN Table3 c ON a.ID = c.ID

这让我回报 ID NameType名称Datetype日期 401 Primary Anu1 DOB 1983-09-25 401 Primary Anu1 DOD 2008-05-07 401 AKA Anu2 DOB 1983-09-25 401 AKA Anu2 DOD 2008-05-07 401 Maiden Anu3 DOB 1983-09-25 401 Maiden Anu3 DOD 2008-05-07

是否有可能得到如下结果:

ID NameType Name Datetype Date 401 Primary Anu1 DOB 1983-09-25 401 AKA Anu2 DOD 2008-05-07 401 Maiden Anu3

或者以任何其他方式,以便相同的名称或日期不会重复多次。

答案 7 :(得分:0)

您必须决定从每个表中添加一条记录并加入,以便只有该记录加入它。显示数据的方式不能在一行中完成,因为连接表中的信息不同,因此您必须确定业务规则用于选择所需的多个记录中的哪一个。

如果您想要主要名称以及DOb和DOD,那么这就是我要做的: 选择a.ID,b.NameType,b.Name,c.date作为DOB,d.date作为DOD 从表1 a LEFT JOIN表2 b ON a.ID = b.ID和b.name_type ='Primary' LEFT JOIN Table3 c ON a.ID = c.ID和c.datetype ='DOB' LEFT JOIN Table3 d ON a.ID = d.ID and d.datetype ='DOD'

现在你可以对其他名称的多个连接做同样的事情,但是你可能不知道你需要提前多少个连接。也是一个解决方案,但它更复杂,我没有时间为你得到它,但基本上你必须创建一个进程,以在某种临时表中连接所有名称(也有id)然后加入到临时表。