私はここに数ヶ月潜んでいて、他の質問を読むことから多くを学びました、しかしこれは私が質問するのに十分勇敢であるのは初めてです!
SELECT * FROM tableA a
JOIN tableB b ON b.tableBid = a.tableBid
WHERE a.tableAcol = 'paramValue';
テーブルBには39行しかありませんが、これらすべてについて、tableAに一致するtableBidを持つparamValueの行があるため、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';
次に、すべての場合にa.tableBidがb.tableBidと一致し、nullがない場合に期待する39行を取得します。
私は明らかに混乱しています。誰かがこれを説明できますか?
実際のデータを投稿することはできませんが、再現することはできます
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