Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
连接到SQL Server中的不同列_Sql_Sql Server_Left Join - Fatal编程技术网

连接到SQL Server中的不同列

连接到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

我在表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     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