【问题标题】:SQL query joining multiple tables and getting information thats in one but not the othersSQL 查询连接多个表并获取其中一个而不是其他表的信息
【发布时间】:2013-04-29 18:37:19
【问题描述】:

我在查询连接三个不同的表并从不同的表中获取信息时遇到问题。

这些表格是:

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

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

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

【问题讨论】:

标签: sql oracle inner-join


【解决方案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

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

【讨论】:

    【解决方案2】:

    要显示TableP 中的DataP1 TableA,请使用内连接:

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

    要显示TableP 中的DataP1不在 TableL 中的值,请执行外连接并查找TableL.DataP1 为@ 的实例987654329@:

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

    把它们放在一起(TablePTableA 中的DataP1 值和TableL 中的not):

    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
    

    【讨论】:

    • 谢谢你,很好的回答,让它更容易理解
    【解决方案3】:

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

    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
    

    希望有帮助

    【讨论】:

      【解决方案4】:

      我不会从要排除的表开始我的“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 中都有数据和没有数据的记录...在这种情况下,您的 where 子句会在表 L 中找到记录时将其排除在外。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-17
        • 2014-03-23
        • 2013-01-29
        • 1970-01-01
        相关资源
        最近更新 更多