Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/201.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查询连接多个表并获取一个表中的信息,而不是其他表中的信息_Sql_Oracle_Inner Join - Fatal编程技术网

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