这是我现在的语句 
strSql2.Append("SELECT a.SystemContractID, a.Income, a.TotalMargin, a.UserCode,a.StrategyID, b.StrategyName FROM OrderProfit_History as a INNER JOIN Strategy as b ON a.StrategyID = b.StrategyID");
   OrderProfit_History表中和Strategy 表中都有StrategyID,但是只有Strategy 表中的
StrategyID 有对应的StrategyName,并且OrderProfit_History表中有Strategy 表所没有的StrategyID。现在的语句执行结果是,返回OrderProfit_History表中所有的StrategyID 在Strategy 表中存在的数据,并显示对应的StrategyName。
    我下面想实现的是,显示OrderProfit_History表中所有的数据,如果StrategyID 在Strategy 表中存在,就显示StrategyName ,反之,则没有对应的StrategyName ,那就在StrategyName 项中用StrategyID 替代吧。 
     表达的应该清楚了吧,本人对SQL不是很懂,不知道我说的这个逻辑能不能用一条SQL语句实现?
SQLselect

解决方案 »

  1.   

    有个coalesce函数,就是一个为空则显示另外一个
      

  2.   


    恩,你说的这个确实能解决了选择的问题,但是我突然发现一个问题:我的新逻辑下不需要 a.StrategyID = b.StrategyID 这个条件,这时候应该怎么控制条件呢,怎么去查找b.StrategyName呢?有没有大神能直接改好了让我看一下。
      

  3.   

    SELECT a.SystemContractID, 
           a.Income, 
           a.TotalMargin, 
           a.UserCode,
           a.StrategyID, 
           ISNULL(b.StrategyName,a.StrategyID) StrategyName 
    FROM OrderProfit_History as a 
    INNER JOIN Strategy as b 
    ON a.StrategyID = b.StrategyID
      

  4.   

    意思是对的,但是我下面不需要ON a.StrategyID = b.StrategyID这个判断了啊,因为a表中有b表中所没有的StrategyID ,这个条件只能显示a、b表所共有的StrategyID ,我现在要显示a表的全部。
      

  5.   

    意思是对的,但是我下面不需要ON a.StrategyID = b.StrategyID这个判断了啊,因为a表中有b表中所没有的StrategyID ,这个条件只能显示a、b表所共有的StrategyID ,我现在要显示a表的全部。
    用LEFT JOIN 
      

  6.   


    select SystemContractID,Income,TotalMargin,UserCode,
    (select ISNULL(StrategyName,a.StrategyID) from Strategy
    where a.StrategyID = StrategyID)
    from OrderProfit_History a这样?
      

  7.   

    if object_id('OrderProfit_History', 'u') is not null
    drop Table OrderProfit_History
    Create Table OrderProfit_History
    (
      ID int identity(1, 1) primary key not null,
      StrategyID int not null,
      OrderID int not null 
    )
    Insert into OrderProfit_History  
    Select 1, 2
    Union all Select 2,2 Union all Select 3,3
    Union all Select 4,4
    Union all Select 5,5
    Union all Select 6,6
    Union all Select 7,7
    Union all Select 8,8
    if OBJECT_ID('Strategy', 'u') is not null
    drop table Strategy
    Create Table Strategy
    (
     ID int identity(1, 1) primary key not null,
     StrategyID int not null,
      StrategyName varchar(128) not null 
    )
    Insert into Strategy
    Select 1, 'aaaa'
    Union all Select 2,'bbbb'
    Union all Select 3,'cccc'
    Union all Select 4,'dddd'Select a.StrategyID, 
      ISNULL(b.StrategyName, CONVERT(Varchar(32), a.StrategyID)) as StrategyName
    From OrderProfit_History a Left Outer Join Strategy b On a.StrategyID = b.StrategyID
      

  8.   


    感谢6、7楼的回复,7楼写的最详细,刚才去了解了下left join的用法,感觉应该没问题了,现在去按照7楼的写法尝试下。
      

  9.   

    意思是对的,但是我下面不需要ON a.StrategyID = b.StrategyID这个判断了啊,因为a表中有b表中所没有的StrategyID ,这个条件只能显示a、b表所共有的StrategyID ,我现在要显示a表的全部。
    用LEFT JOIN 
    SELECT a.SystemContractID, 
           a.Income, 
           a.TotalMargin, 
           a.UserCode,
           a.StrategyID, 
           ISNULL(SELECT TOP 1 StrategyName  
                  FROM Strategy b
                  WHERE a.StrategyID = b.StrategyID ,a.StrategyID) StrategyName 
    FROM OrderProfit_History as a