【问题标题】:Why do 3 tables join produce duplicate rows?为什么 3 个表连接会产生重复的行?
【发布时间】:2017-04-29 13:20:47
【问题描述】:

我有 3 张桌子Vehicletype, VehicleOwner, VehicleInformation 其中VtypeIDVehicletype 中的PK 和VehicleOwnerVehicleInformation 中的FK。

Vehicletype 有 3 行,VehicleOwner 有 7 行,VehicleInformation 也有 7 行。

当我加入 VehicletypeVehicleOwner 时,我得到了 7 条记录的准确结果

Accurate result in the result of 2 table joining

但是当我将这两个表与第三个表 (VehicleInformation) 连接时,我得到了重复的行

Duplicate rows in the result of 3 tables joining

请指导我解决这个问题

【问题讨论】:

  • 您没有提供太多信息以便我们为您提供帮助,但DISTINCT 关键字会在这种情况下删除重复项
  • 这有点难说,因为您的 select 语句只包含 VehicleOwner 和 VehicleType 表中的字段,但很可能是因为 VehicleInformation 表中有与您的 VehicleTypes 相关的数据行。因此,对于“4 Wheeler”VehicleType,VehicleInformation 表中可能存在三个相关行。很难帮助您解决问题,因为我们不知道您真正希望看到的查询结果是什么?你能解释一下你想要达到的目标吗?
  • 如果你能提供所有3张表的数据,那么更容易找到问题。此外,最可能的原因是您的 VehicleInformation 表中将有多个匹配的 VtypeID,从而导致此类记录的交叉连接。
  • 车辆类型:VtypeID VehicleType 1 2 Wheeler 2 4 Wheeler 3 6 Wheeler VehicleOwner: OwnerName Gender VtypeID RegistrationNumber Ata ul Haque Male 2 ADS-770 Aashir Ul Haque Male 1 HAE-3506 kashan male 2 HDDGGG44GG3 wonderwomen female 3 HKGHGEH4IU4 sohaib kjjflkjn 2 jgjk kjgjk kjhkj 1 khjgj 新新 3 新
  • 车辆信息HHY3LOOIAY 4-4-2013 2010超级电力3 HKGHGEH4IU4黑色HDHD3U HDBDH3333HH 7-7-2017 2000正义提升2 JGJK KJGKJJ KJGKJG 2012 JHHGJHGJ 1 KHJGJ JHJH JHFJHF HFHJM JHGHHJ 435 HGFHG 3新新新新新建0 New Span>

标签: sql-server asp.net-mvc


【解决方案1】:

使用 3 个表 Vehicletype、VehicleOwner、VehicleInformation 创建示例数据,其中 typeID 为 PK。

/* 创建表 */

CREATE TABLE Vehicletype(Id integer PRIMARY KEY, Name text);
CREATE TABLE VehicleOwner(OwnerId integer, InfoID integer, TypeId integer, Name text);
CREATE TABLE VehicleInformation(InfoId integer, OwnerId integer, TypeId integer, INfo text);

/* 在 Vehicletype 表中创建少量记录 */

INSERT INTO Vehicletype VALUES(1,'TYPE1');
INSERT INTO Vehicletype VALUES(2,'TYPE2');
INSERT INTO Vehicletype VALUES(3,'TYPE3');

/* 在 VehicleOwner 表中创建少量记录 */

INSERT INTO VehicleOwner VALUES(1,1,1,'NAME1');
INSERT INTO VehicleOwner VALUES(2,2,2,'NAME2');
INSERT INTO VehicleOwner VALUES(3,3,3,'NAME3');
INSERT INTO VehicleOwner VALUES(4,4,1,'NAME4');
INSERT INTO VehicleOwner VALUES(5,5,2,'NAME5');
INSERT INTO VehicleOwner VALUES(6,6,3,'NAME6');
INSERT INTO VehicleOwner VALUES(7,7,1,'NAME7');

/* 在 VehicleInformation 表中创建少量记录 */

INSERT INTO VehicleInformation VALUES(1,1,1,'INFO1');
INSERT INTO VehicleInformation VALUES(2,2,2,'INFO2');
INSERT INTO VehicleInformation VALUES(3,3,3,'INFO3');
INSERT INTO VehicleInformation VALUES(4,4,1,'INFO4');
INSERT INTO VehicleInformation VALUES(5,5,2,'INFO5');
INSERT INTO VehicleInformation VALUES(6,6,3,'INFO6');
INSERT INTO VehicleInformation VALUES(7,7,1,'INFO7');

COMMIT;

/* 显示表中的所有记录 */

SELECT * FROM Vehicletype;
SELECT * FROM VehicleOwner;
SELECT * FROM VehicleInformation;

此连接将为您提供数据的独特结果。

select *
from  Vehicletype vt,VehicleOwner vo, VehicleInformation vi
where 1=1
and vt.id=vo.typeid
and vt.id=vi.typeid
and vo.ownerid=vi.ownerid
and vo.infoid=vi.infoid
and vo.typeid=vi.typeid;

【讨论】:

  • 非常感谢 :) 但我不需要我需要的所有列选择select VehicleOwner.OwnerID, OwnerName, Gender, VType, VehicleInformation.RegistrationNumber, RegistrationDate, ChassisNumber, EngineNumber, Model, ManufacturedBy from VehicleType vt,VehicleOwner vo, VehicleInformation vi where 1=1 and vt.id=vo.typeid and vt.id=vi.typeid and vo.ownerid=vi.ownerid and vo.infoid=vi.infoid and vo.typeid=vi.typeid;
  • 但是这个查询给了我错误 Msg 4104, Level 16, State 1, Line 1 无法绑定多部分标识符“VehicleOwner.OwnerID”。 Msg 4104, Level 16, State 1, Line 1 无法绑定多部分标识符“VehicleInformation.RegistrationNumber”。
  • @AaShirHaq 代替 VehicleOwner.OwnerID 使用 vo.ownerid,vo 是表 VehicleOwner 的别名
【解决方案2】:

假设车主 O1 和 O2 的车辆类型均为 V1。现在,如果车辆信息表中有 I1、I2 和 I3 三个记录,它们的车辆类型为 V1,那么当您创建连接时,您将在输出中获得以下行:

V1, O1, I1
V1, O1, I2
V1, O1, I3
V1, O2, I1
V1, O2, I2
V1, O2, I3

如果您在输出中包含所有 PK 列,您会更清楚地看到发生了什么。

【讨论】:

    猜你喜欢
    • 2014-07-10
    • 2011-03-19
    • 2015-09-11
    • 1970-01-01
    • 1970-01-01
    • 2016-12-30
    • 2017-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多