Sql 连接两个表而不复制

Sql 连接两个表而不复制,sql,firebird,Sql,Firebird,我有这样的桌子 SELECT table1.ID, table1.name, table2.family, null as training FROM table1 INNER JOIN table2 ON table1.ID = table2.ID UNION SELECT table1.ID, table1.name, null as family, table3.training FROM table1 INNER JOIN table2 ON table1.ID = table3.I

我有这样的桌子

SELECT table1.ID, table1.name, table2.family, null as training
FROM table1 INNER JOIN table2 ON table1.ID = table2.ID

UNION

SELECT table1.ID, table1.name, null as family, table3.training
FROM table1 INNER JOIN table2 ON table1.ID = table3.ID
ID        NAME         FAMILY          TRAINING
001       John         Kate            ERP
001       John         Jane            CCNA
001       John         NULL            Java
表1:

ID        NAME
001       John
表2:

ID        NAME          FAMILY
001       John          Kate
001       John          Jane
表3:

ID        NAME          TRAINING
001       John          ERP
001       John          CCNA
001       John          Java
我想连接这些表并显示如下数据:

ID        NAME         FAMILY          TRAINING
001       John         Kate            NULL
001       John         Jane            NULL
001       John         NULL            Java
001       John         NULL            CCNA
001       John         NULL            ERP
联接表:

ID        NAME         FAMILY          TRAINING
001       John         Kate            ERP
001       John         Jane            CCNA
001       John                         Java
有人能帮我找到一个SQL语句,这样我就可以得到那个结果吗

我试着这样使用UNION

SELECT table1.ID, table1.name, table2.family, null as training
FROM table1 INNER JOIN table2 ON table1.ID = table2.ID

UNION

SELECT table1.ID, table1.name, null as family, table3.training
FROM table1 INNER JOIN table2 ON table1.ID = table3.ID
ID        NAME         FAMILY          TRAINING
001       John         Kate            ERP
001       John         Jane            CCNA
001       John         NULL            Java
我得到的结果是这样的:

ID        NAME         FAMILY          TRAINING
001       John         Kate            NULL
001       John         Jane            NULL
001       John         NULL            Java
001       John         NULL            CCNA
001       John         NULL            ERP
但是,我想得到这样的结果

SELECT table1.ID, table1.name, table2.family, null as training
FROM table1 INNER JOIN table2 ON table1.ID = table2.ID

UNION

SELECT table1.ID, table1.name, null as family, table3.training
FROM table1 INNER JOIN table2 ON table1.ID = table3.ID
ID        NAME         FAMILY          TRAINING
001       John         Kate            ERP
001       John         Jane            CCNA
001       John         NULL            Java

所以,这里有人能帮我解决这个问题吗?

不要认为这可以用一般的方法来解决。没有办法将培训与家庭联系起来,二者之间没有联系。Kate与ERP无关,也可能是CCNA或Java。因此,您将始终获得6个结果:John-Kate-3培训,John-Jane-3培训。(从逻辑上讲,这是正确的结果) 如果你真的想要你提到的结果,我想不出你想要的原因,你就必须写一个非泛型的查询。这可能是以下几点: 首先选择约翰、凯特和一个(随机的?)培训班(前1名,或者其他什么,我对firebird不熟悉) 然后为Jane选择相同的选项 最后选择John、NULL和剩余的培训

正如我所说的,这将是一个非泛型查询,在where子句中使用值“Kate”和“Jane”


如果我知道你在哪里,我会对整个设置有一些深刻的想法,以及你想要实现的目标。您正试图使用SQL来做一些它从未打算做的事情,事实上,这与SQL打算做的恰恰相反。

为什么ID字段的值总是为“001”?真的是这样吗?如果不能,你能修复它吗?你使用的是什么版本的Firebird?举个例子,我想显示这样一个用户的数据。我使用firebird 2.5为什么要复制这个名称?这个名称来自主表,它显示了一个重复的值,因为我将它与表2和表3连接起来,表2和表3是表族和表训练。