我有两个表通过以下查询加入。
SELECT
dbo.ORDERLINE.DDCVNB,
dbo.ORDERLINE.DDAFAB,
dbo.ORDERLINE.DDAITX, dbo.ORDERLINE.DDALDT,
dbo.ORDERLINE.DDDUVA, dbo.ORDERLINE.DDARQT,
dbo.ORDERSHIPH.DHCANB, dbo.ORDERSHIPH.DHGGNB,
dbo.ORDERLINE.DDAAGM, dbo.ORDERLINE.DDCHNB,
dbo.ORDERLINE.DDAAGQ
FROM
dbo.ORDERLINE
LEFT OUTER JOIN
dbo.ORDERSHIPH ON dbo.ORDERLINE.DDAFAB = dbo.ORDERSHIPH.DHAFAB AND dbo.ORDERLINE.DDCVNB = dbo.ORDERSHIPH.DHCVNB
ORDERLINE
表有700万行,ORDERSHP
有200万行。
我的查询结果集有1400万行。
左外连接怎么可能?结果集不应该等于ORDERLINE中700万行的行数吗?
答案 0 :(得分:2)
您可能缺少其他加入条件。如果不了解数据库中的所有字段,我们就很难协助。听起来你还需要订单表中的空记录。如果没有,请转到Cory的建议并使用内部联接。
答案 1 :(得分:1)
您的ON子句没有足够的连接条件,并且每个左侧行匹配2个右侧行。基本上是一种交叉产品。
此外,您甚至可能不想要LEFT OUTER JOIN。如果你知道通过RI或左边的每一个在右表中至少有一行你应该使用INNER JOIN。
答案 2 :(得分:0)
我发现了关于外连接的困难方法:
LEFT OUTER JOIN
dbo.ORDERSHIPH ON dbo.ORDERLINE.DDAFAB = dbo.ORDERSHIPH.DHAFAB AND dbo.ORDERLINE.DDCVNB = dbo.ORDERSHIPH.DHCVNB
如果ORDERSHIPH表有多个具有相同DHAFAB和DHCVNB值的记录(假设两个),那么select子句将返回一组行为FOR ORDERSHIPH的两个记录。这意味着700万次两次。如果ORDERSHIPH允许说3个具有相同值的记录,则会收到3组数据作为回报。