1

我无法进行连接三个不同表并从不同表获取信息的查询。

这些表是:

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

但这仅显示了 TableL 中的值,而不是 TableA 和 TableP 中的值(基本上相反)

我尝试添加诸如...

when TableL.DataP1 <> TableA.DataP1

...但这似乎没有帮助。

如果您能提供有关我哪里出错的见解,那将非常有帮助谢谢

4

4 回答 4

1

要显示DataP1inTableP 和 in TableA的值,请使用内部联接:

SELECT TableP.DataP1
  FROM TableP
  INNER JOIN TableA On TableP.DataP1 = TableA.DataP1

要显示DataP1inTableP in 的 TableL值,请执行外部连接并查找TableL.DataP1is的实例NULL

SELECT TableP.DataP1
  FROM TableP
  LEFT OUTER JOIN TableL ON TableP.DataP1 = TableL.DataP1
  WHERE TableL.DataP1 IS NULL

把它们放在一起(DataP1值 inTableP和 inTableA不是in 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
于 2013-04-29T18:45:40.613 回答
1

对 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

内连接要求连接的两边(即两个表)都有与连接条件匹配的记录。左连接将始终返回连接左侧表的结果,即使右侧没有匹配项。

于 2013-04-29T18:42:35.340 回答
0

我不会从要排除的表开始我的“FROM”子句。根据我对您的问题的理解:

需要在 TableP 和 TableA 中找到的数据;但是,如果在 TableL 中找到该记录,则排除该记录。

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 子句会排除记录。

于 2013-04-29T18:44:57.473 回答
0

您需要进行左连接并检查空字段

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

希望有帮助

于 2013-04-29T18:43:41.780 回答