【问题标题】:Joining three tables - Mysq-l an inner and outer join perhaps?连接三个表——Mysql 可能是一个内连接和外连接?
【发布时间】:2014-10-16 15:10:04
【问题描述】:

我正在努力让这个查询工作。我有三个表,我想做一个查询来获得红色区域。 每个圆圈是一个具有不同结构的表格。我已经管理了很多内部连接的组合,但我特别无法获得所有红色区域。

A Payments : idPayment , idInvoice , Amount , date.

B发票:idInvoice,金额日期。

C PromissoryNotes:IdNote、idInvoice、金额、日期。

到目前为止...

SELECT B.idInvoice,A.idPayment,C.idNote FROM (Invoice b INNER JOIN payment a ON a.idInvoice=b.idInvoice) LEFT OUTER JOIN PromissoryNotes c ON c.idInvoice=b.idInvoice ORDER BY idInvoice。

没用过

有什么建议吗?

【问题讨论】:

    标签: mysql sql join


    【解决方案1】:
    SELECT p.idInvoice, p.idPayment, idNote 
    FROM Payments p JOIN Invoice i ON p.adInvoice-i.adInvoice RIGHT OUTER JOIN PromissoryNotes
    UNION
    SELECT i.idInvoice, idPayment, idNote 
    FROM Invoice i JOIN PromissoryNotes pn ON i.idInvoice=pn.idInvoice RIGHT OUTER JOIN Payments
    

    您需要包含外部连接,因为要联合的结果表必须具有相同的架构。我相信这些是查询中所需的字段。

    【讨论】:

      【解决方案2】:

      你可以通过两种方式做到这一点:

      1) 创建一个集合A作为B和A的内连接,创建一个集合C作为B和C的内连接,然后联合A和C。

      2) 创建一个内连接 A 和 B 的子查询,然后完全外连接到一个内连接 C 和 B 的子查询。

      1) 示例

      SELECT  b.idInvoice FROM Invoice B 
      JOIN Payments A on A.IdInvoice = B.IdInvoice
      UNION 
      SELECT  b.idInvoice FROM Invoice B 
      JOIN PromissoryNotes C on c.idInvoice = B.id Invoice
      

      2)的例子

      SELECT idInvoice FROM 
          ( 
              SELECT  b.idInvoice FROM Invoice B 
              JOIN Payments A on A.IdInvoice = B.IdInvoice
          ) B FULL OUTER JOIN 
          (
              SELECT  b.idInvoice FROM Invoice B 
              JOIN Payments A on A.IdInvoice = B.IdInvoice
          ) C on b.idInvoice = C.idInvoice 
      

      【讨论】:

        【解决方案3】:

        这能解决问题吗?

        SELECT 
        ZZ.idInvoice,
        ZZ.idPayment,
        YY.idInvoice,
        YY.idNote 
        FROM
        (SELECT idInvoice, idPayment
            FROM Invoice b 
                INNER JOIN payments a ON a.idInvoice=b.idInvoice) AS ZZ
        FULL OUTER JOIN
        (SELECT idInvoice, idNote
            FROM PromissoryNotes c 
                INNER JOIN payments a ON a.idInvoice=c.idInvoice) AS YY ON ZZ.idInvoice = YY.idInvoice
        

        【讨论】:

          【解决方案4】:

          你已经很接近了——另一个 OUTER JOIN 和一些 WHERE 标准可以解决问题:

          SELECT B.idInvoice, A.idPayment, C.idNote 
          FROM Invoice b 
              LEFT JOIN payments a ON a.idInvoice=b.idInvoice
              LEFT JOIN PromissoryNotes c ON c.idInvoice=b.idInvoice 
          WHERE a.idInvoice IS NOT NULL 
              OR c.idInvoice IS NOT NULL
          ORDER BY B.idInvoice
          

          这基本上说的是给我表 B 中的所有结果,其中表 a 或表 c 中有匹配项。

          【讨论】:

          • 这不会只选择维恩图的中心吗?您的 where 子句使此查询等效于内部联接。
          • @mrtig -- 如果您在WHERE 标准中使用AND,则可以。但这使用OR
          • 抱歉,我的错误
          【解决方案5】:

          试试

          SELECT B.idInvoice, A.idPayment, C.idNote FROM Invoice B INNER JOIN payments A ON        A.idInVoice = B.idInvoice INNER JOIN PromissoryNotes C ON C.idInvoice = B.idInvoice ORDER BY idInvoice
          

          INNER JOIN 意味着你得到两个表的交集。所以这就是你想要的。

          【讨论】:

          • 这不是只选择维恩图的中间吗?
          猜你喜欢
          • 2016-08-31
          • 2014-02-24
          • 1970-01-01
          • 2016-12-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多