我正在尝试加入多个表格。 表1具有不同的ID 表2为每个ID SAY 3 NAMES有多个名称 表3每个ID有2个日期
当我加入三个表时,我为每个ID获取了6行数据,每个名称出现两次,每个日期出现三次。
我想只写3行,为每个ID返回不同的3个名称和不同的2个日期。在SQL中使用Joins时有没有办法做到这一点?
答案 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子句
答案 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)然后加入到临时表。