6

我已经在这里潜伏了几个月,从阅读其他问题中学到了很多东西,但这是我第一次有勇气问一个问题!

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
4

1 回答 1

2

您的查询输出中的一个逻辑假设:如果发生这种情况,那就是一个错误。

在透露您正在使用Xeround 引擎之后,我认为您应该编写您收集的测试用例并将其作为错误提交到他们的错误列表或论坛中。

于 2013-02-08T22:49:14.940 回答