关于左外连接sql

时间:2011-07-27 05:02:46

标签: sql

所以这就是场景,我有两个表格paymentreceipt字段

  • payment_date, payment_amount, payment_party_code

和类似的

  • receipt_date, receipt_amount, receipt_party_code.

我在付款表中有4行,在收据表中有11行。

我想要做的是从payment以及receipt表格中选择party_code相同的所有行。我通过使用左外连接但未通过,因为它正在做笛卡尔数据产品。

请帮我解决这个问题

由于

4 个答案:

答案 0 :(得分:2)

如果您只需要在payment_party_code上匹配的记录,则应使用“INNER JOIN”。但正如marc_s所说,你需要确保在“ON”子句中指定加入条件。

答案 1 :(得分:1)

您需要使用LEFT OUTER JOIN并在其上定义JOIN条件:

SELECT 
  p.payment_date, p.payment_amount, p.payment_party_code,
  r.receipt_date, r.receipt_amount, r.receipt_party_code
FROM
  dbo.Payment p
LEFT OUTER JOIN
  dbo.Receipt r ON p.payment_party_code = r.receipt_party_code

这适用于SQL Server(T-SQL)。如果省略JOIN条件(ON p.payment_party_code = r.receipt_party_code部分),您将获得笛卡尔积。

这将列出Payment表中的所有行,如果它们在Receipt表中有信息,那么也会显示。

如果您想要相反的(Receipt中的所有内容,即使Payment中没有对应的行),您也需要切换FROM ... LEFT OUTER JOIN中的表格(选择从Receipt开始),或者您需要使用RIGHT OUTER JOIN,以便从Receipt获得所有内容。

你可能想看看Jeff Atwood发布的Venn diagrams of SQL JOINs - 非常清楚JOIN类型的不同之处......

答案 2 :(得分:0)

select * 
from party p
left outer join receipt r on p.party_code = r.party_code 

答案 3 :(得分:0)

Left Outer Join

Left Outer Join逻辑运算符返回满足第一个(顶部)输入和第二个(底部)输入的连接的每一行。它还返回第一个输入中第二个输入中没有匹配行的任何行。第二个输入中的不匹配行作为空值返回。如果Argument列中不存在连接谓词,则每一行都是匹配的行

SELECT 
  pay.payment_date, pay.payment_amount, pay.payment_party_code,
  rec.receipt_date, rec.receipt_amount, rec.receipt_party_code
FROM
  payment pay
LEFT OUTER JOIN
  receipt rec ON pay.payment_party_code = rec.receipt_party_code