w*****y 发帖数: 35 | 1 【 以下文字转载自 Programming 讨论区,原文如下 】
发信人: wellboy (好男孩- MITBBS MEMBER SINCE 1998), 信区: Programming
标 题: Can anyone interpret this simple SQL?
发信站: Unknown Space - 未名空间 (Fri Jan 14 12:13:55 2005) WWW-POST
Access->Queries->New->Find Unmatched Query Wizard->"this wizard creates a
query that finds records in one table that have no related records in another
table"
SELECT A.ID
FROM A LEFT JOIN B ON A.ID = B.ID
WHERE (B.ID Is Null)
What does this SQL mean?
HELP! |
n****f 发帖数: 905 | 2
another
This is a BAD SQL, DO NOTHING.
NO row will be returned.
【在 w*****y 的大作中提到】 : 【 以下文字转载自 Programming 讨论区,原文如下 】 : 发信人: wellboy (好男孩- MITBBS MEMBER SINCE 1998), 信区: Programming : 标 题: Can anyone interpret this simple SQL? : 发信站: Unknown Space - 未名空间 (Fri Jan 14 12:13:55 2005) WWW-POST : Access->Queries->New->Find Unmatched Query Wizard->"this wizard creates a : query that finds records in one table that have no related records in another : table" : SELECT A.ID : FROM A LEFT JOIN B ON A.ID = B.ID : WHERE (B.ID Is Null)
|
aw 发帖数: 127 | 3 嗯?没错啊?找出A TABLE里有,而B里没有的RECORDS啊?
【在 n****f 的大作中提到】 : : another : This is a BAD SQL, DO NOTHING. : NO row will be returned.
|
n**m 发帖数: 255 | 4 DROP TABLE A;
DROP TABLE B;
COMMIT;
CREATE TABLE A (ID INT);
CREATE TABLE B (ID INT);
COMMIT;
INSERT INTO A VALUES(1);
INSERT INTO A VALUES(2);
INSERT INTO A VALUES(3);
INSERT INTO A VALUES(NULL);
INSERT INTO B VALUES(3);
INSERT INTO B VALUES(4);
【在 aw 的大作中提到】 : 嗯?没错啊?找出A TABLE里有,而B里没有的RECORDS啊?
|
n**m 发帖数: 255 | 5 Nmamtf talked about inner join:
SELECT A.ID
FROM A INNER JOIN B ON A.ID = B.ID
WHERE (B.ID Is Null)
【在 n****f 的大作中提到】 : : another : This is a BAD SQL, DO NOTHING. : NO row will be returned.
|
w*****y 发帖数: 35 | 6 WHERE (B.ID Is Null)
如何解释?
糊涂了。
a
【在 n**m 的大作中提到】 : Nmamtf talked about inner join: : SELECT A.ID : FROM A INNER JOIN B ON A.ID = B.ID : WHERE (B.ID Is Null)
|
w*****y 发帖数: 35 | 7 嗯。高人啊。
同属易懂的解释一下WHERE (B.ID Is Null) 的道理好吧?
【在 n**m 的大作中提到】 : DROP TABLE A; : DROP TABLE B; : COMMIT; : CREATE TABLE A (ID INT); : CREATE TABLE B (ID INT); : COMMIT; : : INSERT INTO A VALUES(1); : INSERT INTO A VALUES(2); : INSERT INTO A VALUES(3);
|
aw 发帖数: 127 | 8 很简单啊。
如果这样你是不是容易理解点?
SELECT A.ID,B.ID
FROM A LEFT JOIN B ON A.ID = B.ID
WHERE (B.ID Is Null)
假设A
ID VAL
1 100
2 200
3 300
B:
ID VAL
1 100
2 200
QUERY(如果不加B.ID IS NULL)得:
1 1
2 2
3 NULL
加上得:
3 NULL。
**********************
然后WHERE前面去掉B.ID也一样得到3这个ID。
这种QUERY TRICK经常用到,即用LEFT JOIN做个类似减的操作。
【在 w*****y 的大作中提到】 : 嗯。高人啊。 : 同属易懂的解释一下WHERE (B.ID Is Null) 的道理好吧?
|
w*****y 发帖数: 35 | 9 谢谢。
我关键没有充分理解Left Join 的含义。 现在知道了。
Also recommend http://www.w3schools.com/sql/sql_join.asp for those who are
still as confused as I used to be :)
非常感谢AW!
【在 aw 的大作中提到】 : 很简单啊。 : 如果这样你是不是容易理解点? : SELECT A.ID,B.ID : FROM A LEFT JOIN B ON A.ID = B.ID : WHERE (B.ID Is Null) : 假设A : ID VAL : 1 100 : 2 200 : 3 300
|
w*****y 发帖数: 35 | 10 问题 :
可以用:
SELECT A.ID from A
where A.ID Not In
(Select B.ID from B)
吗?
有效率差别吗?
谢谢。
【在 aw 的大作中提到】 : 很简单啊。 : 如果这样你是不是容易理解点? : SELECT A.ID,B.ID : FROM A LEFT JOIN B ON A.ID = B.ID : WHERE (B.ID Is Null) : 假设A : ID VAL : 1 100 : 2 200 : 3 300
|
aw 发帖数: 127 | 11 NOT IN是非常不好的SQL(效率上),应尽可能避免。
【在 w*****y 的大作中提到】 : 问题 : : 可以用: : SELECT A.ID from A : where A.ID Not In : (Select B.ID from B) : 吗? : 有效率差别吗? : 谢谢。
|