表一:Order(订单表)
OrderId    OrderNo      Operator
   2    SH001       张三
   3    SH002       李四
   4    SH003       王二 表二:OrderDetail(订单明细表)
ProductId      OrderId       ProductNo  Style   Color
  1002 2    R001     A001    C001
  1003 2           R002     A002    C002
  1004 2    R003     A003    C003
  1005 3    R101     A101    C101
  1006 3    R001     A001    C001查询条件组合可能会为:1)Order.Operator = '张三'2) Order.Operator = '李四'  and OrderDetail.ProductNo = 'R001'3) OrderDetail.ProductNo = 'R001'结果始终包括以下几个字段:
OrderNo  ProductNo  Style  Color针对查询条件1它的结果为:
OrderNo  ProductNo  Style  Color
 SH001    R001      A001    C001
 SH001    R002      A002    C002
 SH001    R003      A003    C003针对查询条件2它的结果为:
OrderNo  ProductNo  Style  Color
 SH002    R001      A001    C001针对查询条件3它的结果为:
OrderNo  ProductNo  Style  Color
 SH001    R001      A001    C001
 SH002    R001      A001    C001其实上面的查询条件组合是动态的,所以只是举个例子,我想前面SQL是固定的,然后后面的whereClause子句通过程序动态生成.
这个固定的SQL该如何写?谢谢!!

解决方案 »

  1.   

    --示意代码
     Sql='Select OrderNo , ProductNo , Style,  Color 
     From Order A Left Join OrderDetail B
     On A.OrderID=B.OrderID
     Where 1=1 '
    ------------------固定
     If CheckBox1.Checked    
      Sql=Sql+' and Order.Operator='+Trim(Edit1.Text);
     If CheckBox2.Checked
      Sql=Sql+' and OrderDetail.ProductNo='+Trim(Edit2.Text);
    .
    .
    .
    .
    最后执行Sql就可以了
      

  2.   

    select
        a.OrderNo,b.ProductNo,b.Style,b.Color
    from
        Order a
    inner join
        OrderDetail b
    on
        a.OrderId=b.OrderId
    where
        ......  --whereClause子句
      

  3.   

    TO liangpei2008:
    谢谢你的回复,但可能前面需要加一个distinct。但我们这有个同事说这种写法性能不是很好,我以前也都是用左连接来处理的,我那个同事觉得用in可能会性能更好一些。
      

  4.   

    to libin_ftsafe:
    谢谢你的回复,内连接可能会有点问题,因为如果子表里没数据就查不出来了。
    刚才我的问题可能不够清楚,其实不管子表里是否有数据,主表的数据都要出来。
    我现在的困惑是用了左连接后,性能就会差一些?数据量大概在百万级。
    还有个问题请教一下:
    where A in ('A1','A2','A3')这一句和 where A = 'A1' or A = 'A2' or A = 'A3' 性能应该是一样的吧??
      

  5.   

    楼主的意思应该是查订单明细,那么使用DISTINCT有必要吗?
    如果要使用存储过程,可以这样试一下:
    if object_id('[Order]') is not null
    drop table [Order]
    if object_id('OrderDetail') is not null
    drop table OrderDetail
    if object_id('sptest') is not null
    drop proc sptest
    go
    ----创建测试数据
    create table [Order](OrderId int,OrderNo varchar(10),Operator varchar(10))
    insert [Order]
    select 2,'SH001','张三' union all
    select 3,'SH002','李四' union all
    select 4,'SH003','王二' 
    create table OrderDetail(ProductId int,OrderId int,ProductNo varchar(10),Style varchar(10),Color varchar(10))
    insert OrderDetail
    select 1002,2,'R001','A001','C001' union all
    select 1003,2,'R002','A002','C002' union all
    select 1004,2,'R003','A003','C003' union all
    select 1005,3,'R101','A101','C101' union all
    select 1006,3,'R001','A001','C001' 
    go
    ----创建存储过程,参数为查询条件
    create proc sptest @condition varchar(1000)= ''
    as
    declare @sql varchar(4000)
    set @sql = 'select [Order].OrderNo,OrderDetail.ProductNo,OrderDetail.Style,OrderDetail.Color
    from OrderDetail left join [Order] on OrderDetail.OrderId = [Order].OrderId ' + 
    case  when @condition = '' then '' else 'Where 'end + @condition
    --print @sql
    exec(@sql)
    go
    ----测试
    exec sptest '[Order].Operator = ''张三'''
    exec sptest '[Order].Operator = ''李四''  and OrderDetail.ProductNo = ''R001'''
    exec sptest 'OrderDetail.ProductNo = ''R001'''
    ----清除测试环境
    drop proc sptest
    drop table [Order]
    drop table OrderDetail
      

  6.   

    楼主,这种情况,建议用带参数的存储过程来实现:
    以你的要求为例,SP有两个参数,Operator和ProductNo ,默认值都为''。Declare @sql Nvarchar(1000)
    Set @sql = 'Select a.字段,b.字段 From (Select 相关字段 From [Order] Where 1 = 1 'IF @Operator <> ''
    Set @sql = @sql + 'And Operator = ''' +@operator+ ''' 'Set @sql = @sql +') a,(select 相关字段 From OrderDetails Where 1=1'IF @ProductNo <> ''
    Set @sql = @sql + 'And ProductNo = ''' +@ProductNo + ''' 'Set @sql = @sql + ') b Where a.OrderID = b.OrderID'Select @sql
    --Exec(@sql)原理就是先根据条件,把两张表的内容先筛选一遍,然后再进行连接!