连接到SQL Server中的不同列
我在表1下有一个主表:连接到SQL Server中的不同列,sql,sql-server,left-join,Sql,Sql Server,Left Join,我在表1下有一个主表: Name ID Entry_Dt PEREZ 2000 8/14/2014 PEREZ 2000 8/29/2017 Domingo 2098 8/29/2017 我还有另一张表2: kid_id Parent_id 2098 2000 我希望我的结果如下: Name
Name ID Entry_Dt
PEREZ 2000 8/14/2014
PEREZ 2000 8/29/2017
Domingo 2098 8/29/2017
我还有另一张表2:
kid_id Parent_id
2098 2000
我希望我的结果如下:
Name Kid_id Parent_id Entry_dt
PEREZ 2000 8/14/2014
PEREZ 2000 8/29/2017
Domingo 2098 8/29/2017
我使用了两种不同的方法,如下面的示例,但结果并不理想
1:联合方法
2:左连接方法:
为什么我的方法不起作用?有改进的想法吗?您应该使用左连接
select A.Name, A.ID, B.kid_id, B.Entry_dt
FROM Table1 A
LEFT JOIN Table2 B ON A.ID= B.Kid_id
您必须链接两个不同的
连接
,第一个是父母的左连接
(如果存在),第二个也是孩子的左连接
(如果存在)
因此,可以在字段列表中将kind\u id
/parent\u id
显示为两个不同的列
试试这个:
SELECT main.name, main.id, kid.Kid_id, parent.parent_id, main.Entry_dt
FROM Table1 main
LEFT JOIN Table2 kid
ON main.id = kid.Kid_id
LEFT JOIN Table2 parent
ON main.id = parent.Parent_id
请参见此处的您不需要左连接-您也可以进行内部连接。 左联接的要点是当您需要一个表中的行而另一个表中不存在时,但是在这里,表1中的每一行都与表2中的行相匹配。您需要在联接条件中使用OR 要获得想要的输出,您需要在select中做一些工作。见示例:
SELECT A.Name,
CASE
WHEN A.ID = B.Parent_Id THEN
A.ID
ELSE
''
END AS ID,
CASE
WHEN A.ID = b.Kid_Id THEN
b.Kid_Id
ELSE
''
END AS Kid_Id,
CASE
WHEN A.ID = b.Parent_Id THEN
b.Parent_ID
ELSE
''
END AS Parent_Id,
A.Entry_Dt
FROM Table1 A
INNER JOIN Table2 b
ON (
A.ID = b.Kid_id
OR A.ID = b.Parent_id
);
您可以通过将表2与表1连接两次来实现这一点。一个是父母,另一个是孩子 查询
select table1.name, table1.ID, parent.parent_Id, kid.kid_id,table1.Entry_dt
from table1
left join table2 parent on parent.parent_Id = table1.id
left join table2 kid on kid.kid_id = table1.id
输出
尝试使用完全外部联接。请解释一下逻辑。我不明白为什么第三行缺少
id
。我也不明白为什么两个表中都包括Name
,特别是在第二个表中有两次。@GordonLinoff,我编辑了我原来的问题。非常接近我应该做的。今后的建议是,让你的别名反映上下文。。。如“A”、“B”和“C”作为主、父、子。上下文和abc更容易理解别名的上下文。我知道,这是一个例子,但也要像你需要知道未来的正确用途一样。@Drapp:是的,我使用了我们作品中相同的别名(C除外)。你是对的,很神秘:)@Drapp:我更改了别名;)
SELECT A.Name,
CASE
WHEN A.ID = B.Parent_Id THEN
A.ID
ELSE
''
END AS ID,
CASE
WHEN A.ID = b.Kid_Id THEN
b.Kid_Id
ELSE
''
END AS Kid_Id,
CASE
WHEN A.ID = b.Parent_Id THEN
b.Parent_ID
ELSE
''
END AS Parent_Id,
A.Entry_Dt
FROM Table1 A
INNER JOIN Table2 b
ON (
A.ID = b.Kid_id
OR A.ID = b.Parent_id
);
select table1.name, table1.ID, parent.parent_Id, kid.kid_id,table1.Entry_dt
from table1
left join table2 parent on parent.parent_Id = table1.id
left join table2 kid on kid.kid_id = table1.id