You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 18:54:58