建立测试环境:
CREATE TABLE [RdRecord2] (
[ID] [int]  NOT NULL,
[PersonCode] [char]  (10) NULL,
[SHPersonCode] [char]  (10) NULL)ALTER TABLE [RdRecord2] WITH NOCHECK ADD  CONSTRAINT [PK_RdRecord2] PRIMARY KEY  NONCLUSTERED ( [ID] )
INSERT [RdRecord2] ([ID],[PersonCode],[SHPersonCode]) VALUES ( 1,'001','002')
INSERT [RdRecord2] ([ID],[PersonCode],[SHPersonCode]) VALUES ( 2,'001','003')CREATE TABLE [Person] (
[PersonCode] [char]  (10) NOT NULL,
[PersonName] [char]  (50) NULL)ALTER TABLE [Person] WITH NOCHECK ADD  CONSTRAINT [PK_Person] PRIMARY KEY  NONCLUSTERED ( [PersonCode] )
INSERT [Person] ([PersonCode],[PersonName]) VALUES ( '001','人员1')
INSERT [Person] ([PersonCode],[PersonName]) VALUES ( '002','人员2')
INSERT [Person] ([PersonCode],[PersonName]) VALUES ( '003','人员3')
INSERT [Person] ([PersonCode],[PersonName]) VALUES ( '004','人员4')=======================================
问题:我的查询语句:
SELECT rdr.[ID], rdr.PersonCode,Person.PersonName,
  rdr.SHPersonCode,Person.PersonName as SHPersonName  FROM RdRecord2 rdr  
  LEFT JOIN Person ON rdr.PersonCode=Person.PersonCode
  LEFT JOIN Person p ON rdr.SHPersonCode=p.PersonCode
  WHERE rdr.[ID]=1相当于一个表和另外一个表连接两次(一个表的两个字段和另一个表有关系),可是结果不正确,
由于原表字段非常多,只选了几个简单的字段,且可为空,只能用Left join

解决方案 »

  1.   

    SELECT rdr.[ID], 
           rdr.PersonCode,Person.PersonName,
           rdr.SHPersonCode, 
           (select Person.PersonName from Person where PersonCode = rdr.PersonCode and rdr.[ID]=1) as SHPersonName
    FROM RdRecord2 rdr  
    LEFT JOIN Person ON rdr.PersonCode=Person.PersonCode
    WHERE rdr.[ID]=1
      

  2.   

    CREATE TABLE [RdRecord2] (
    [ID] [int]  NOT NULL,
    [PersonCode] [char]  (10) NULL,
    [SHPersonCode] [char]  (10) NULL)ALTER TABLE [RdRecord2] WITH NOCHECK ADD  CONSTRAINT [PK_RdRecord2] PRIMARY KEY  NONCLUSTERED ( [ID] )
    INSERT [RdRecord2] ([ID],[PersonCode],[SHPersonCode]) VALUES ( 1,'001','002')
    INSERT [RdRecord2] ([ID],[PersonCode],[SHPersonCode]) VALUES ( 2,'001','003')CREATE TABLE [Person] (
    [PersonCode] [char]  (10) NOT NULL,
    [PersonName] [char]  (50) NULL)ALTER TABLE [Person] WITH NOCHECK ADD  CONSTRAINT [PK_Person] PRIMARY KEY  NONCLUSTERED ( [PersonCode] )
    INSERT [Person] ([PersonCode],[PersonName]) VALUES ( '001','人员1')
    INSERT [Person] ([PersonCode],[PersonName]) VALUES ( '002','人员2')
    INSERT [Person] ([PersonCode],[PersonName]) VALUES ( '003','人员3')
    INSERT [Person] ([PersonCode],[PersonName]) VALUES ( '004','人员4')SELECT rdr.[ID], 
           rdr.PersonCode,Person.PersonName,
           rdr.SHPersonCode, 
           (select Person.PersonName from Person where PersonCode = rdr.PersonCode and rdr.[ID]=1) as SHPersonName
    FROM RdRecord2 rdr  
    LEFT JOIN Person ON rdr.PersonCode=Person.PersonCode
    WHERE rdr.[ID]=1--drop table rdrecord2,person/*
    ID          PersonCode PersonName                                         SHPersonCode SHPersonName                                       
    ----------- ---------- -------------------------------------------------- ------------ -------------------------------------------------- 
    1           001        人员1                                                002          人员1                                             (所影响的行数为 1 行)*/
      

  3.   

    SELECT rdr.[ID], rdr.PersonCode,Person.PersonName,
      rdr.SHPersonCode,P.PersonName as SHPersonName                ---这里别名写错了  FROM RdRecord2 rdr  
      LEFT JOIN Person ON rdr.PersonCode=Person.PersonCode
      LEFT JOIN Person p ON rdr.SHPersonCode=p.PersonCode
      WHERE rdr.[ID]=1
      

  4.   

    最好这样清清楚楚
    SELECT rdr.[ID], rdr.PersonCode,P1.PersonName,
      rdr.SHPersonCode,P2.PersonName as SHPersonName  FROM RdRecord2 rdr  
      LEFT JOIN Person p1 ON rdr.PersonCode=P1.PersonCode
      LEFT JOIN Person p2 ON rdr.SHPersonCode=p2.PersonCode
      WHERE rdr.[ID]=1
      

  5.   

    --这个完全用left join,你看看结果对不对
    CREATE TABLE [RdRecord2] (
    [ID] [int]  NOT NULL,
    [PersonCode] [char]  (10) NULL,
    [SHPersonCode] [char]  (10) NULL)ALTER TABLE [RdRecord2] WITH NOCHECK ADD  CONSTRAINT [PK_RdRecord2] PRIMARY KEY  NONCLUSTERED ( [ID] )
    INSERT [RdRecord2] ([ID],[PersonCode],[SHPersonCode]) VALUES ( 1,'001','002')
    INSERT [RdRecord2] ([ID],[PersonCode],[SHPersonCode]) VALUES ( 2,'001','003')CREATE TABLE [Person] (
    [PersonCode] [char]  (10) NOT NULL,
    [PersonName] [char]  (50) NULL)ALTER TABLE [Person] WITH NOCHECK ADD  CONSTRAINT [PK_Person] PRIMARY KEY  NONCLUSTERED ( [PersonCode] )
    INSERT [Person] ([PersonCode],[PersonName]) VALUES ( '001','人员1')
    INSERT [Person] ([PersonCode],[PersonName]) VALUES ( '002','人员2')
    INSERT [Person] ([PersonCode],[PersonName]) VALUES ( '003','人员3')
    INSERT [Person] ([PersonCode],[PersonName]) VALUES ( '004','人员4')SELECT rdr.[ID], 
           rdr.PersonCode,Person.PersonName,
           rdr.SHPersonCode, 
           (select Person.PersonName from Person left join rdrecord2 on Person.PersonCode = rdrecord2.PersonCode where rdrecord2.[ID]=1) as SHPersonName
    FROM RdRecord2 rdr  
    LEFT JOIN Person ON rdr.PersonCode=Person.PersonCode
    WHERE rdr.[ID]=1--drop table rdrecord2,person/*
    ID          PersonCode PersonName                                         SHPersonCode SHPersonName                                       
    ----------- ---------- -------------------------------------------------- ------------ -------------------------------------------------- 
    1           001        人员1                                                002          人员1                                             (所影响的行数为 1 行)*/
      

  6.   

    潇洒老乌龟(原名:爱新觉罗.毓华)
    的查询结果有错误,具体是
    应该是:
    /*
    ID          PersonCode PersonName                                         SHPersonCode SHPersonName                                       
    ----------- ---------- -------------------------------------------------- ------------ 
    1           001        人员1           002          人员2   --这里是002的姓名        
      

  7.   

    LZ 下面的是正确结果
    SELECT rdr.[ID], rdr.PersonCode,P1.PersonName,
      rdr.SHPersonCode,p2.PersonName as SHPersonName  FROM RdRecord2 rdr  
      LEFT JOIN Person p1 ON rdr.PersonCode=Person.PersonCode
      LEFT JOIN Person p2 ON rdr.SHPersonCode=p.PersonCode
      WHERE rdr.[ID]=1
    /*
    ID          PersonCode PersonName                                         SHPersonCode SHPersonName                                       
    ----------- ---------- -------------------------------------------------- ------------ -------------------------------------------------- 
    1           001        人员1                                                002          人员2                                             
    */
      

  8.   

    LZ   下面的是正确结果   SELECT rdr.[ID], rdr.PersonCode,P1.PersonName,
      rdr.SHPersonCode,p2.PersonName as SHPersonName  FROM RdRecord2 rdr  
      LEFT JOIN Person p1 ON rdr.PersonCode=P1.PersonCode
      LEFT JOIN Person p2 ON rdr.SHPersonCode=p2.PersonCode
      WHERE rdr.[ID]=1
    /*
    ID          PersonCode PersonName                                         SHPersonCode SHPersonName                                       
    ----------- ---------- -------------------------------------------------- ------------ -------------------------------------------------- 
    1           001        人员1                                                002          人员2                                             
    */