使用关系数据库通常我使用INNER JOIN加入表。从联接表中查询数据时,它返回过多的值。作为一个例子,我创建了一个虚拟数据表,如下所示。
表序列是每天操作可以有很多,每天可以有很多活动,每个活动的活动UID都是唯一的。
通常我会以INNER JOIN为例,将Activity表与Activity表连接,以查询每个操作的类,阶段,操作,根的每个细分。但是它会返回过多的Durationhrs。最糟糕的情况是如果加入所有3个表(操作,每日,活动),它将返回超出信仰的大量小时值。
我的问题是
我的数据库
CREATE TABLE Operation
(`Operationuid` varchar(3), `operationname` varchar(10), `owner` varchar(55))
;
INSERT INTO operation
(`Operationuid`, `operationname`, `owner`)
VALUES
('AA1', 'Cow', 'Jon Letoy'),
('AA2', 'Chicken', 'Ridikill' ),
('AA3', 'Snake', 'Mighty'),
('AA4', 'Sheep', 'The great'),
('AA5', 'Pig', 'Peon');
CREATE TABLE Activity
(`Operationuid` varchar(3), `DailyUID` varchar(10), `ActivityUID` varchar(55), `Class` varchar(3), `Phase` varchar(3), `Ops` varchar(3), `Root` varchar(3), Duration int);
INSERT INTO Activity
(`Operationuid`, `DailyUID`, `ActivityUID`, `Class`, `Phase`, `Ops`, `Root`, `Duration`)
VALUES
('AA1', 'DD1', 'AC1', 'AB1', 'PH1', 'OP1', null, 12),
('AA1', 'DD1', 'AC2', 'AB1', 'PH2', 'OP1', null, 2),
('AA1', 'DD1', 'AC3', 'AB2', 'PH2', 'OP2', 'RR1', 3),
('AA1', 'DD1', 'AC4', 'AB3', 'PH3', 'OP3', null, 5),
('AA1', 'DD1', 'AC5', 'AB4', 'PH4', 'OP4', 'RR2', 1);
CREATE TABLE Daily
(`Operationuid` varchar(3), `DailyUID` varchar(10), `Dayno` varchar(55), `Daycost` decimal);
INSERT INTO Daily
(`Operationuid`, `DailyUID`, `Dayno`, `Daycost`)
VALUES
('AA1', 'DD1', 1, 1000),
('AA1', 'DD2', 2, 2000),
('AA1', 'DD3', 3, 3000),
('AA1', 'DD4', 4, 4000),
('AA1', 'DD5', 5, 5000);
Select operation.*, daily.*, activity.* from Operation
INNER JOIN daily on daily.operationUID=operatin.operationUID
INNER JOIN activity on activity.operationUID=operation.operationUID
这将返回25个结果,而不仅仅是我需要的5个结果?
答案 0 :(得分:2)
你的JOIN有点问题。您已在此处加入了Activity
表:INNER JOIN activity on activity.operationUID=activity.operationUID
您可能需要将其更正为:
Select operation.*, daily.*, activity.* from Operation
INNER JOIN daily on daily.operationUID=operation.operationUID
INNER JOIN activity on operation.operationUID=activity.operationUID
在此处查看:http://sqlfiddle.com/#!9/1a4ae9/8
在该结果上,您将看到25行结果。这是因为当您在没有JOIN操作的情况下查询多个表时,所涉及的表之间会发生笛卡尔平面,这将导致所有表中行数的乘积,在您的情况下,它将为5 * 5 * 5。但是,由于我们有JOIN
操作,您会收到operation
和daily
表之间的等价,因此5个注册表比您添加另一个具有activity
表的连接,该表还有5个以上的注册表Operationuid
等于AA1
因此它将导致第一个连接的每个注册表(每日操作)与活动表上的所有注册表。