我已经在这里潜伏了几个月,从阅读其他问题中学到了很多东西,但这是我第一次有勇气问一个问题!
SELECT * FROM tableA a
JOIN tableB b ON b.tableBid = a.tableBid
WHERE a.tableAcol = 'paramValue';
我在表 B 中只有 39 行,对于其中的每个人来说,在 tableA 中都有一行用于 paramValue 和匹配的 tableBid,所以我希望得到 39 行。事实上,在另一个数据库实例中,我确实这样做了。
我看不出实例中有任何显着差异,尽管这可能是无知,但在这个新实例中,我只得到 7 条具有相同查询的记录。
如果我将查询更改为
SELECT * FROM tableA a
LEFT JOIN tableB b ON b.tableBid = a.tableBid
WHERE a.tableAcol = 'paramValue';
或者
SELECT * FROM tableA a
LEFT JOIN tableB b ON a.tableBid = b.tableBid
WHERE a.tableAcol = 'paramValue';
然后我得到了我期望的 39 行 a.tableBid 在所有情况下都匹配 b.tableBid 并且没有空值
我显然很困惑。谁能解释一下。
无法发布真实数据,但我可以重现它
CREATE TABLE tableB (
tableBid varchar(30) NOT NULL PRIMARY KEY,
nameB varchar(25) NOT NULL ,
description varchar(40) NOT NULL);
CREATE TABLE tableA (
userID varchar(30) NOT NULL,
tableBid Varchar(30) NOT NULL,
info varchar(10) NOT NULL,
PRIMARY KEY(userID, tableBID));
insert into tableB (tableBid, nameB, description)
values
('a', 'a name', 'blah'),
('b', 'b name', 'blah'),
('c', 'c name', 'blah'),
('d', 'd name', 'blah');
insert into tableA (userID, tableBid, info)
values
('deel','a', 'blah'),
('deel','b', 'blah'),
('deel','c', 'blah'),
('deel','d', 'blah');
然后
SELECT * FROM tableA a
LEFT JOIN tableB b ON b.tableBid = a.tableBid
WHERE a.userID = 'deel';
给了我 4 行:
deel a blah a a name blah
deel b blah b b name blah
deel c blah c c name blah
deel d blah d d name blah
但
SELECT * FROM tableA a
JOIN tableB b ON b.tableBid = a.tableBid
WHERE a.userID = 'deel';
给我
deel d blah d d name blah
表定义
CREATE TABLE `tablea` (
`userID` varchar(30) NOT NULL,
`tableBid` varchar(30) NOT NULL,
`info` varchar(10) NOT NULL,
PRIMARY KEY (`userID`,`tableBid`)
) ENGINE=Xeround DEFAULT CHARSET=latin1
CREATE TABLE `tableb` (
`tableBid` varchar(30) NOT NULL,
`nameB` varchar(25) NOT NULL,
`description` varchar(40) NOT NULL,
PRIMARY KEY (`tableBid`)
) ENGINE=Xeround DEFAULT CHARSET=latin1