SQL查询连接多个表并获取一个表中的信息,而不是其他表中的信息
我在创建一个连接三个不同表并从不同表获取信息的查询时遇到问题 各表如下:SQL查询连接多个表并获取一个表中的信息,而不是其他表中的信息,sql,oracle,inner-join,Sql,Oracle,Inner Join,我在创建一个连接三个不同表并从不同表获取信息的查询时遇到问题 各表如下: TableP DataP1 (primary key) TableL DataL1 (primary key) DataP1 (foreign key) TableA DataA1 (primary key) DataP1 (foreign key) Date 我需要显示没有出现在TableL中但出现在TableP和TableA中的DataP1值,以及从TableA中获取的相关日期 到目前为止,我有这样的想法:
TableP
DataP1 (primary key)
TableL
DataL1 (primary key)
DataP1 (foreign key)
TableA
DataA1 (primary key)
DataP1 (foreign key)
Date
我需要显示没有出现在TableL中但出现在TableP和TableA中的DataP1值,以及从TableA中获取的相关日期
到目前为止,我有这样的想法:
Select TableL.DataP1, TableA.date
from TableP
inner join TableL on TableP.DataP1 = TableL.DataP1
inner join TableA on TableP.DataP1 = TableA.DataP1
但这只显示了表L中的值,而不是表A和表p中的值(基本上相反)
我试着添加一些东西,比如
when TableL.DataP1 <> TableA.DataP1
当table l.DataP1 table a.DataP1
。。。但这似乎没有帮助
如果你能深入了解我的错误所在,那将非常有帮助
谢谢对TableL使用左连接而不是内部连接,然后仅选择数据TableL部分中具有空值的行:
SELECT p.DataP1, a.Date
FROM TableP p
INNER JOIN TableA a ON p.DataP1 = a.DataP1
LEFT JOIN TableL l ON l.DataP1 = p.DataP1
WHERE l.DataL1 IS NULL
内部联接要求联接的两侧(即两个表)都有符合联接条件的记录。左联接将始终返回联接左侧表的结果,即使右侧没有匹配项。您需要执行左联接并检查空字段
SELECT TableL.DataP1, TableA.date
FROM TableP tp
inner join TableA ta on tp.DataP1 = ta.DataP1
LEFT JOIN TableL tl ON tl.DataP1 = ta.DataP1
WHERE tl.DataP1 IS NULL
希望这对我有所帮助,我不会用我想排除的表开始我的“FROM”子句。根据我对你问题的理解:
需要在表p和表A中找到的数据;但是,如果在表1中找到,则排除该记录
SELECT
l.DataP1
, a.Date
FROM TableP p
Inner Join TableA a
on p.DataP1 = a.DataP1
Left Join TableL l
on p.DataP1 = l.DataP1
WHERE
-- you'll join on TableL and here you exclude it when the data is found there
l.DataL1 is null
表A的内部连接将确保您只提取在p和A中都有数据的记录。表L的左侧连接将显示在表L中都有数据和没有数据的记录。。。在这种情况下,当在表L中找到where子句时,它将排除记录。以显示
表p
和表A
中的数据P1
值,您使用了一个内部联接:
SELECT TableP.DataP1
FROM TableP
INNER JOIN TableA On TableP.DataP1 = TableA.DataP1
要显示
TableP
中的DataP1
值和TableL
中的非值,请执行外部联接并查找TableL.DataP1
为NULL
的实例:
SELECT TableP.DataP1
FROM TableP
LEFT OUTER JOIN TableL ON TableP.DataP1 = TableL.DataP1
WHERE TableL.DataP1 IS NULL
要将其放在一起(DataP1
值在TableP
和TableA
中,而不是在TableL
中),请执行以下操作:
您将希望最后一次加入TableL并使用
左加入
:谢谢,回答得很好,而且更容易理解
SELECT TableP.DataP1
FROM TableP
INNER JOIN TableA On TableP.DataP1 = TableA.DataP1
LEFT OUTER JOIN TableL ON TableP.DataP1 = TableL.DataP1
WHERE TableL.DataP1 IS NULL