Sql server Join没有返回正确的结果

Sql server Join没有返回正确的结果,sql-server,Sql Server,我的SQL连接未返回所需的输出 表格:[访问数据] [PAT_ID] [VISITDATE] [TBLE_NAME] [CODE_ID] [env_ID] [NAME] 表格:[env_lkup] [PAT_ID] [VISITDATE] [TBLE_NAME] [CODE_ID] [env_ID] [NAME] 所需输出: PAT_ID VISITDATE env_ID NAME AAA000 1995-05-02 4 dusty air AAA000 199

我的SQL连接未返回所需的输出

表格:[访问数据]

[PAT_ID]
[VISITDATE]
[TBLE_NAME]
[CODE_ID]
[env_ID]
[NAME]
表格:[env_lkup]

[PAT_ID]
[VISITDATE]
[TBLE_NAME]
[CODE_ID]
[env_ID]
[NAME]
所需输出:

PAT_ID  VISITDATE   env_ID  NAME
AAA000  1995-05-02  4       dusty air
AAA000  1995-05-02  3       secondary cigarette smoke
AAA001  1999-07-07  1       air conditioning
  SELECT v.[PAT_ID]   
       , v.[VISITDATE]   
       , e.[env_ID]    
       , e.[NAME]   
  FROM [visit_data] v
  LEFT JOIN [env_lkup] e ON e.env_ID = v.CODE_ID
  WHERE v.TBLE_NAME = 'env_lkup'
PAT_ID  VISITDATE   env_ID  NAME
AAA000  1995-05-02  NULL    NULL
AAA000  1995-05-02  NULL    NULL
AAA001  1999-07-07  NULL    NULL
PAT_ID  VISITDATE   env_ID  NAME
AAA000  1995-05-02  NULL    NULL
AAA000  1995-05-02  NULL    NULL
AAA001  1999-07-07  NULL    NULL
PAT_ID  VISITDATE   env_ID  NAME
AAA000  1995-05-02  4   dusty air
AAA000  1995-05-02  3   secondary cigarette smoke
AAA001  1999-07-07  1   air conditioning
SQL:

PAT_ID  VISITDATE   env_ID  NAME
AAA000  1995-05-02  4       dusty air
AAA000  1995-05-02  3       secondary cigarette smoke
AAA001  1999-07-07  1       air conditioning
  SELECT v.[PAT_ID]   
       , v.[VISITDATE]   
       , e.[env_ID]    
       , e.[NAME]   
  FROM [visit_data] v
  LEFT JOIN [env_lkup] e ON e.env_ID = v.CODE_ID
  WHERE v.TBLE_NAME = 'env_lkup'
PAT_ID  VISITDATE   env_ID  NAME
AAA000  1995-05-02  NULL    NULL
AAA000  1995-05-02  NULL    NULL
AAA001  1999-07-07  NULL    NULL
PAT_ID  VISITDATE   env_ID  NAME
AAA000  1995-05-02  NULL    NULL
AAA000  1995-05-02  NULL    NULL
AAA001  1999-07-07  NULL    NULL
PAT_ID  VISITDATE   env_ID  NAME
AAA000  1995-05-02  4   dusty air
AAA000  1995-05-02  3   secondary cigarette smoke
AAA001  1999-07-07  1   air conditioning
结果输出:

PAT_ID  VISITDATE   env_ID  NAME
AAA000  1995-05-02  4       dusty air
AAA000  1995-05-02  3       secondary cigarette smoke
AAA001  1999-07-07  1       air conditioning
  SELECT v.[PAT_ID]   
       , v.[VISITDATE]   
       , e.[env_ID]    
       , e.[NAME]   
  FROM [visit_data] v
  LEFT JOIN [env_lkup] e ON e.env_ID = v.CODE_ID
  WHERE v.TBLE_NAME = 'env_lkup'
PAT_ID  VISITDATE   env_ID  NAME
AAA000  1995-05-02  NULL    NULL
AAA000  1995-05-02  NULL    NULL
AAA001  1999-07-07  NULL    NULL
PAT_ID  VISITDATE   env_ID  NAME
AAA000  1995-05-02  NULL    NULL
AAA000  1995-05-02  NULL    NULL
AAA001  1999-07-07  NULL    NULL
PAT_ID  VISITDATE   env_ID  NAME
AAA000  1995-05-02  4   dusty air
AAA000  1995-05-02  3   secondary cigarette smoke
AAA001  1999-07-07  1   air conditioning

有人能帮忙吗?

查看加入列的数据

LEFT JOIN [env_lkup] e ON e.env_ID = v.CODE_ID
如果ID列都是varchar(),并且其中一个ID列在值中有一个前导空格,则我可以复制结果的唯一方法

当其中一个id列为int时,SQLServer进行隐式转换并返回数据

表达式中的类型转换(CONVERT_IMPLICIT(int[e].[env_ID],0)) 可能会影响查询计划选择、类型转换中的“CardinalityEstimate” 在表达式中(CONVERT_IMPLICIT(int[e].[env_ID],0)=[v].[CODE_ID])可以 影响查询计划选择中的“SeekPlan”

我是如何重现不期望的结果的:

Declare @visit_data TABLE 
    ([PAT_ID] varchar(6), [VISITDATE] date, [TBLE_NAME] varchar(11), [CODE_ID] varchar(1));
    
INSERT INTO @visit_data
    ([PAT_ID], [VISITDATE], [TBLE_NAME], [CODE_ID])
VALUES
    ('AAA000', '1995-05-02', 'COMSYS_lkup', '1'),
    ('AAA000', '1995-05-02', 'env_lkup', '4'),
    ('AAA000', '1995-05-02', 'env_lkup', '3'),
    ('AAA001', '1999-07-07', 'COMSYS_lkup', '5'),
    ('AAA001', '1999-07-07', 'env_lkup', '1');

Declare @env_lkup TABLE
    ([env_ID] varchar(2), [NAME] varchar(25));
    
INSERT INTO @env_lkup
    ([env_ID], [NAME])
VALUES
    (' 1', 'air conditioning'),
    (' 2', 'pollution'),
    (' 3', 'secondary cigarette smoke'),
    (' 4', 'dusty air');

SELECT v.[PAT_ID]   
       , v.[VISITDATE]   
       , e.[env_ID]    
       , e.[NAME]   
  FROM @visit_data v
  LEFT JOIN @env_lkup e ON e.env_ID = v.CODE_ID
  WHERE v.TBLE_NAME = 'env_lkup';
INSERT INTO @env_lkup
    ([env_ID], [NAME])
VALUES
    ('1 ', 'air conditioning'),
    ('2 ', 'pollution'),
    ('3 ', 'secondary cigarette smoke'),
    ('4 ', 'dusty air');
结果(前导空格):

PAT_ID  VISITDATE   env_ID  NAME
AAA000  1995-05-02  4       dusty air
AAA000  1995-05-02  3       secondary cigarette smoke
AAA001  1999-07-07  1       air conditioning
  SELECT v.[PAT_ID]   
       , v.[VISITDATE]   
       , e.[env_ID]    
       , e.[NAME]   
  FROM [visit_data] v
  LEFT JOIN [env_lkup] e ON e.env_ID = v.CODE_ID
  WHERE v.TBLE_NAME = 'env_lkup'
PAT_ID  VISITDATE   env_ID  NAME
AAA000  1995-05-02  NULL    NULL
AAA000  1995-05-02  NULL    NULL
AAA001  1999-07-07  NULL    NULL
PAT_ID  VISITDATE   env_ID  NAME
AAA000  1995-05-02  NULL    NULL
AAA000  1995-05-02  NULL    NULL
AAA001  1999-07-07  NULL    NULL
PAT_ID  VISITDATE   env_ID  NAME
AAA000  1995-05-02  4   dusty air
AAA000  1995-05-02  3   secondary cigarette smoke
AAA001  1999-07-07  1   air conditioning
注意:如果空格在后面,您将获得所需的结果:

Declare @visit_data TABLE 
    ([PAT_ID] varchar(6), [VISITDATE] date, [TBLE_NAME] varchar(11), [CODE_ID] varchar(1));
    
INSERT INTO @visit_data
    ([PAT_ID], [VISITDATE], [TBLE_NAME], [CODE_ID])
VALUES
    ('AAA000', '1995-05-02', 'COMSYS_lkup', '1'),
    ('AAA000', '1995-05-02', 'env_lkup', '4'),
    ('AAA000', '1995-05-02', 'env_lkup', '3'),
    ('AAA001', '1999-07-07', 'COMSYS_lkup', '5'),
    ('AAA001', '1999-07-07', 'env_lkup', '1');

Declare @env_lkup TABLE
    ([env_ID] varchar(2), [NAME] varchar(25));
    
INSERT INTO @env_lkup
    ([env_ID], [NAME])
VALUES
    (' 1', 'air conditioning'),
    (' 2', 'pollution'),
    (' 3', 'secondary cigarette smoke'),
    (' 4', 'dusty air');

SELECT v.[PAT_ID]   
       , v.[VISITDATE]   
       , e.[env_ID]    
       , e.[NAME]   
  FROM @visit_data v
  LEFT JOIN @env_lkup e ON e.env_ID = v.CODE_ID
  WHERE v.TBLE_NAME = 'env_lkup';
INSERT INTO @env_lkup
    ([env_ID], [NAME])
VALUES
    ('1 ', 'air conditioning'),
    ('2 ', 'pollution'),
    ('3 ', 'secondary cigarette smoke'),
    ('4 ', 'dusty air');
结果(尾随空格):

PAT_ID  VISITDATE   env_ID  NAME
AAA000  1995-05-02  4       dusty air
AAA000  1995-05-02  3       secondary cigarette smoke
AAA001  1999-07-07  1       air conditioning
  SELECT v.[PAT_ID]   
       , v.[VISITDATE]   
       , e.[env_ID]    
       , e.[NAME]   
  FROM [visit_data] v
  LEFT JOIN [env_lkup] e ON e.env_ID = v.CODE_ID
  WHERE v.TBLE_NAME = 'env_lkup'
PAT_ID  VISITDATE   env_ID  NAME
AAA000  1995-05-02  NULL    NULL
AAA000  1995-05-02  NULL    NULL
AAA001  1999-07-07  NULL    NULL
PAT_ID  VISITDATE   env_ID  NAME
AAA000  1995-05-02  NULL    NULL
AAA000  1995-05-02  NULL    NULL
AAA001  1999-07-07  NULL    NULL
PAT_ID  VISITDATE   env_ID  NAME
AAA000  1995-05-02  4   dusty air
AAA000  1995-05-02  3   secondary cigarette smoke
AAA001  1999-07-07  1   air conditioning

中的
d
是什么,其中d.TBLE='env_lkup'
?我只在
FROM
子句中看到表别名
v
e
。至于你的
ON
条款。您是否有一个值为
4
code\u ID
env\u ID
表中的
env\u ID
相对应?共享这两个表中与所需结果/输出匹配的一些示例数据会有所帮助。visit_表中的CODE_ID不等于4,因此这两个表不会像您认为的那样连接。我更正了别名,这是
v
中的
其中v.TBLE_NAME='env_lkup'
您的代码返回您的预期结果:您需要发布完整的表结构,包括数据类型,以防数据类型不匹配。将id列强制转换为int修复了强制转换时的
(e.ENVIRON_id as int)=强制转换(v.code_id as int)
@charlescaper,如果这些列总是要存储int,那么可以将列设置为int而不是强制转换为int吗?对联接进行强制转换会影响性能,这意味着表中的每一行,如果有许多行,则转换速度会很慢。使用强制转换:表达式中的类型转换(CONVERT(int[e].[env_ID],0))可能会影响查询计划选择中的“CardinalityEstimate”,表达式中的类型转换(CONVERT(int[v].[CODE_ID],0))可能会影响查询计划选择中的“CardinalityEstimate”,表达式中的类型转换(CONVERT(int[e].[env_ID],0)=[Expr1005])可能会影响查询计划选择中的“SeekPlan”