我试图从一个表中获取数据,所以我就这样加入:
SELECT A.ACCT_NO
FROM ACCOUNT AS A
RIGHT OUTER JOIN CUSTOMER AS C
ON A.CUST_ID = C.CUST_ID
WHERE C.FIRST_NM = 'ADAM';
现在的问题是,我对联接的运作方式有些困惑。如果我将其更改为:
LEFT OUTER JOIN CUSTOMER AS C
甚至:
INNER JOIN CUSTOMER AS C
我得到了完全相同的数据!我在这里跟随这张图表:
http://i.stack.imgur.com/1UKp7.png
基于此,我假设只有RIGHT OUTER JOIN可以工作,因为它只是从CUSTOMER中提取列。然而,似乎并非如此,因为两个外连接都起作用。另外,我很震惊地看到INNER JOIN工作。为什么是这样?或者是因为我缺少关于加入SQL的关键概念?
谢谢!
答案 0 :(得分:1)
此查询将为不在Account表中的值和Customer表中的所有记录返回空值
SELECT *
FROM ACCOUNT AS A
RIGHT OUTER JOIN CUSTOMER AS C
ON A.CUST_ID = C.CUST_ID
此查询将返回不在Customer表中的值的空值以及Account表中的所有记录
SELECT *
FROM ACCOUNT AS A
LEFT JOIN CUSTOMER AS C
ON A.CUST_ID = C.CUST_ID
此查询不会返回客户表中没有等效项的行,因此只返回来自拥有客户的帐户的行。
SELECT *
FROM ACCOUNT AS A
INNER JOIN CUSTOMER AS C
ON A.CUST_ID = C.CUST_ID
答案 1 :(得分:0)
这可能意味着您在每个键上都匹配。
如果没有密钥不匹配,RIGHT JOIN
,LEFT JOIN
和INNER JOIN
都应返回相同的数据。
所以您所看到的是'ADAM'
中名为CUSTOMER
的每位客户,ACCOUNT
中都有相应的条目。
答案 2 :(得分:0)
使用外连接时,表中只需要匹配记录的限制条件必须放在连接上,或者必须使用或条件来处理NULL。如果不这样做,您将获得与INNER Join相同的结果。它与何时发生连接以及何时应用where子句条件有关。当限制条件在连接上时,它发生在连接之前,在where子句之后。在where子句中,外连接生成的NULL值然后被where子句排除...使它看起来像一个内连接。
由于我认为您想要所有帐户但只需要名字为Adam的客户信息,您需要左连接,但将where子句标准移动到连接。
首选:
SELECT A.ACCT_NO
FROM ACCOUNT AS A
LEFT OUTER JOIN CUSTOMER AS C
ON A.CUST_ID = C.CUST_ID
AND C.FIRST_NM = 'ADAM';
OR
如果你必须
SELECT A.ACCT_NO
FROM ACCOUNT AS A
LEFT OUTER JOIN CUSTOMER AS C
ON A.CUST_ID = C.CUST_ID
WHERE (C.FIRST_NM = 'ADAM' OR c.First_NM is null)
但是c.First_NM不能是可空的,或者你无法区分连接上的null和记录上的null。
http://blog.codinghorror.com/a-visual-explanation-of-sql-joins/获取关于加入的帮助。
表格的顺序很重要......
RIGHT JOIN
。LEFT JOIN
FULL OUTER JOIN
INNER JOIN