表一: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该如何写?谢谢!!
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该如何写?谢谢!!
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就可以了
a.OrderNo,b.ProductNo,b.Style,b.Color
from
Order a
inner join
OrderDetail b
on
a.OrderId=b.OrderId
where
...... --whereClause子句
谢谢你的回复,但可能前面需要加一个distinct。但我们这有个同事说这种写法性能不是很好,我以前也都是用左连接来处理的,我那个同事觉得用in可能会性能更好一些。
谢谢你的回复,内连接可能会有点问题,因为如果子表里没数据就查不出来了。
刚才我的问题可能不够清楚,其实不管子表里是否有数据,主表的数据都要出来。
我现在的困惑是用了左连接后,性能就会差一些?数据量大概在百万级。
还有个问题请教一下:
where A in ('A1','A2','A3')这一句和 where A = 'A1' or A = 'A2' or A = 'A3' 性能应该是一样的吧??
如果要使用存储过程,可以这样试一下:
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
以你的要求为例,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)原理就是先根据条件,把两张表的内容先筛选一遍,然后再进行连接!