【问题标题】:how to use left outer join after left join for this tables?如何在此表的左连接后使用左外连接?
【发布时间】:2016-11-23 06:06:56
【问题描述】:

我有 4 个表要加入,以便在其中获取必要的数据。

表 A。

id | name | deleted | amount | due_date   | status
1  | a    | 0       | 10     | 2016-07-18 | Unpaid
2  | b    | 0       | 20     | 2016-07-19 | Unpaid
3  | c    | 0       | 15     | 2016-07-18 | Unpaid

表 B

id | name   | due_date   | status
1  | a      |            | Unpaid
2  | b      |            | Unpaid
3  | c      |            | Unpaid
4  | d      | 2016-07-19 | Unpaid

表 C

id | table_d_id | table_a_id
1  | 1          | 1
2  | 2          | 2
3  | 3          | 3

表 D

id | 
1
2
3

我在这里要做的是检索表 B 中具有到期日期和未付款状态的数据,并且在表 A 中找不到它。

我当前的查询:

SELECT  A.*, B.*, C.*, D.*  
FROM A  
LEFT OUTER JOIN B ON B.name= A.name 
INNER JOIN C ON A.id = C.id  
INNER JOIN D ON C.id = D.id  
WHERE A.deleted=0 AND ((B.due_date < "2016-07-20" AND B.status = "Unpaid") OR (A.due_date < "2016-07-20" AND A.status = "Unpaid")) 
GROUP BY D.id

这个查询目前所做的是它只获取表中的数据,除了表 B 中的 id 4,我也希望检索它,因为它处于未付费状态。

【问题讨论】:

  • 第一件事 LEFT JOIN 和 LEFT OUTER JOIN 都是一样的
  • @DhavalBhavsar 我不知道我刚刚检查了谷歌并看到 OUTER 连接从两个表中获取所有内容。

标签: mysql sql-server join


【解决方案1】:

试试这个:

SELECT  A.*, B.*, C.*, D.*  
FROM B  
LEFT OUTER JOIN A ON A.name= B.name 
LEFT OUTER JOIN C ON C.id = B.id  
LEFT OUTER JOIN D ON D.id = B.id  
WHERE A.deleted=0 AND ((B.due_date < "2016-07-20" AND B.status = "Unpaid") OR (A.due_date < "2016-07-20" AND A.status = "Unpaid")) 
GROUP BY D.id

【讨论】:

  • 我无法将 FROM A 更改为 FROM B。所以我需要使用 FROM A 的解决方案
【解决方案2】:

您应该使用左连接(并且在您的示例中,b.column 是名称而不是数字 ..)

SELECT  A.*, B.*, C.*, D.*  
FROM B  
LEFT JOIN A_cstm ON A.id = A_cstm.id_c  
LEFT  JOIN A ON B.name = A.name 
INNER JOIN C ON A.id = C.id  
INNER JOIN D ON C.id = D.id  
WHERE A.deleted=0 AND ((B.due_date < "2016-07-20" AND B.status = "Unpaid") OR (A.due_date < "2016-07-20" AND A.status = "Unpaid")) 
GROUP BY D.id

表 A_cstm 未在您的模型中描述(为清楚起见,我已删除..) 我已经使用 FROM B 更改了加入的顺序,并左加入 A 而不是你的 FROM A ..左加入 B

SELECT  A.*, B.*, C.*, D.*  
FROM B  
LEFT  JOIN A ON B.name = A.name 
INNER JOIN C ON A.id = C.id  
INNER JOIN D ON C.id = D.id  
WHERE A.deleted=0 AND ((B.due_date < "2016-07-20" AND B.status = "Unpaid") OR (A.due_date < "2016-07-20" AND A.status = "Unpaid")) 
GROUP BY D.id    

【讨论】:

  • 已编辑以修复错误,但在尝试查询后仍然没有得到表 B 中的第 4 个元素
  • 我已经更新了分析器..有一些建议..希望有用
  • 在不改变 FROM 的情况下没有其他方法可以做到这一点,因为我无法改变那部分,我只能添加连接语句。
  • 似乎很奇怪,您无法更改 from ..我认为您没有获得第 4 个元素只是因为您从表 A 开始(带有 3 个元素)
  • 我正在使用sugarcrm,它只允许在一定程度上进行定制,这就是为什么我在干扰主查询方面受到限制,只能在其默认查询之后添加一些查询。所以这似乎是我无法检索第四个元素的原因,我找到了一个可能的解决方案,并将为此发布一个不同的问题。感谢您的宝贵时间
【解决方案3】:

请使用下面的查询

SELECT  A.*, B.*, C.*, D.*  
FROM A  
LEFT JOIN A_cstm ON A.id = A_cstm.id_c  
LEFT JOIN B ON B.number = A.name 
INNER JOIN C ON A_cstm.id_c = C.id
INNER JOIN D ON C.table_d_id = D.id  
WHERE A.deleted=0 AND ((B.due_date < "2016-07-20" AND B.status = "Unpaid") OR (A.due_date < "2016-07-20" AND A.status = "Unpaid")) 
GROUP BY D.id

【讨论】:

  • 依然得不到表B的第4个元素
猜你喜欢
  • 2011-10-01
  • 1970-01-01
  • 2016-10-02
  • 1970-01-01
  • 1970-01-01
  • 2011-09-10
  • 1970-01-01
  • 2013-01-30
  • 1970-01-01
相关资源
最近更新 更多