所以这就是场景,我有两个表格payment
和receipt
字段
payment_date, payment_amount, payment_party_code
和类似的
receipt_date, receipt_amount, receipt_party_code.
我在付款表中有4行,在收据表中有11行。
我想要做的是从payment
以及receipt
表格中选择party_code
相同的所有行。我通过使用左外连接但未通过,因为它正在做笛卡尔数据产品。
请帮我解决这个问题
由于
答案 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逻辑运算符返回满足第一个(顶部)输入和第二个(底部)输入的连接的每一行。它还返回第一个输入中第二个输入中没有匹配行的任何行。第二个输入中的不匹配行作为空值返回。如果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