INNER JOIN查询结果不符合预期原因咨询(SQL Server)
SQL查询结果不符合预期的原因及修正
一、数据库表结构
CREATE TABLE MASTER ( ID uniqueidentifier NOT NULL, NAME varchar(50) NOT NULL, ADDRESS varchar(200) NULL ); CREATE TABLE CONNECTOR ( ID uniqueidentifier NOT NULL, CODE varchar(50) NOT NULL, MASTER_ID uniqueidentifier NULL ); ALTER TABLE MASTER ADD CONSTRAINT PK_MASTER PRIMARY KEY (ID ASC); ALTER TABLE CONNECTOR ADD CONSTRAINT PK_CONNECTOR_MASTER PRIMARY KEY (ID ASC); ALTER TABLE CONNECTOR ADD CONSTRAINT FK_CONNECTOR_MASTER FOREIGN KEY (MASTER_ID) REFERENCES MASTER (ID) ON DELETE No Action ON UPDATE No Action;
二、表数据
MASTER表数据
ID NAME ADDRESS 11111111-1111-0000-0000-000000000001 N1 A1 11111111-1111-0000-0000-000000000002 N2 A2 11111111-1111-0000-0000-000000000003 N3 A3
CONNECTOR表数据
ID CODE MASTER_ID 22222222-1111-0000-0000-000000000001 X 11111111-1111-0000-0000-000000000001 22222222-1111-0000-0000-000000000002 Y 11111111-1111-0000-0000-000000000001 22222222-1111-0000-0000-000000000003 X 11111111-1111-0000-0000-000000000002 22222222-1111-0000-0000-000000000004 W 11111111-1111-0000-0000-000000000002 22222222-1111-0000-0000-000000000005 U 11111111-1111-0000-0000-000000000003
三、原查询语句
select * from test.dbo.MASTER m inner join test.dbo.CONNECTOR c ON c.MASTER_ID=m.ID where 'X' IN (select c2.CODE from CONNECTOR c2 where MASTER_ID='11111111-1111-0000-0000-000000000001');
四、实际查询结果
11111111-1111-0000-0000-000000000001 N1 A1 22222222-1111-0000-0000-000000000001 X 11111111-1111-0000-0000-000000000001 11111111-1111-0000-0000-000000000001 N1 A1 22222222-1111-0000-0000-000000000002 Y 11111111-1111-0000-0000-000000000001 11111111-1111-0000-0000-000000000002 N2 A2 22222222-1111-0000-0000-000000000003 X 11111111-1111-0000-0000-000000000002 11111111-1111-0000-0000-000000000002 N2 A2 22222222-1111-0000-0000-000000000004 W 11111111-1111-0000-0000-000000000002 11111111-1111-0000-0000-000000000003 N3 A3 22222222-1111-0000-0000-000000000005 U 11111111-1111-0000-0000-000000000003
五、预期查询结果
11111111-1111-0000-0000-000000000001 N1 A1 22222222-1111-0000-0000-000000000001 X 11111111-1111-0000-0000-000000000001
六、问题原因
你的WHERE子句中的子查询是独立判断逻辑,它仅验证MASTER_ID='11111111-1111-0000-0000-000000000001'的CONNECTOR记录里是否存在CODE='X'的条目。由于数据库中确实存在这条记录,该子查询的结果始终为真,整个WHERE子句等价于WHERE 1=1,不会过滤任何关联后的记录,因此返回了所有MASTER与CONNECTOR关联的5行数据。
你的真实需求应该是:筛选出**MASTER_ID为指定值且CODE='X'**的CONNECTOR记录,并关联对应的MASTER信息。
七、修正后的查询语句
写法一:直接添加过滤条件(最简洁)
select * from test.dbo.MASTER m inner join test.dbo.CONNECTOR c ON c.MASTER_ID=m.ID where c.MASTER_ID='11111111-1111-0000-0000-000000000001' and c.CODE='X';
写法二:调整子查询关联逻辑(适用于复杂关联场景)
select * from test.dbo.MASTER m inner join test.dbo.CONNECTOR c ON c.MASTER_ID=m.ID where (c.MASTER_ID, c.CODE) IN ( select c2.MASTER_ID, c2.CODE from CONNECTOR c2 where c2.MASTER_ID='11111111-1111-0000-0000-000000000001' and c2.CODE='X' );
内容的提问来源于stack exchange,提问作者HowToTellAChild
相关产品推荐
相关产品推荐

