求对两张表查询的SQL语句写法

时间:2022-04-15 14:52:29
想做个对两张表查询的SQL,比如有三个TextBox,用户输入值作为查询条件,其中前两个输入值针对第一张表,第三个输入值针对第二张表。最后的查询值为一个数据集。比如有两张表:开发商定义表Developer和产品表Product,典型字段如下:Developer表的字段有开发商名称和开发商等级,Product表的字段有开发商名称和产品名称。每个开发商有个数不定的产品,存在产品表中。用户可以输入最多三个条件(也可能只有一个或两个,右用户输入决定)查询开发商。三个预定义的条件是开发商等级,开发商名称和开发商的产品,这可以做三个TextBox,有用户输入条件,用户可以输入1到3个条件。后台根据这些条件进行开发商查询。其中前两个条件查Developer表,第三个条件查Product表。求得最后符合条件的表。我的理解是,最终的结果是前两个条件对Developer表的查询结果和第三个条件对Product表的查询结果的交集。这样的SQL语句怎么写?谢谢!

5 个解决方案

#1




--假设三个变量分别为:@v1,@v2,@v3

declare @v1 int,@v2 int, @v3 varchar(100)

select A.*,B.*
from A inner join B on A.ID=B.ID
where (@v1 is null or A.字段1=@v1)
  and (@v2 is null or A.字段2=@v2)
  and (@v3 is null or B.字段名=@v3)


当然也可以用动态SQL语句。

#2



动态sql语句基本语法 
1 :普通SQL语句可以用Exec执行 

eg:   Select * from tableName 
         Exec('select * from tableName') 
         Exec sp_executesql N'select * from tableName'    -- 请注意字符串前一定要加N 

2:字段名,表名,数据库名之类作为变量时,必须用动态SQL 

eg:   
declare @fname varchar(20) 
set @fname = 'FiledName' 
Select @fname from tableName              -- 错误,不会提示错误,但结果为固定值FiledName,并非所要。 
Exec('select ' + @fname + ' from tableName')     -- 请注意 加号前后的 单引号的边上加空格 

当然将字符串改成变量的形式也可 
declare @fname varchar(20) 
set @fname = 'FiledName' --设置字段名 

declare @s varchar(1000) 
set @s = 'select ' + @fname + ' from tableName' 
Exec(@s)                -- 成功 
exec sp_executesql @s   -- 此句会报错 



declare @s Nvarchar(1000)  -- 注意此处改为nvarchar(1000) 
set @s = 'select ' + @fname + ' from tableName' 
Exec(@s)                -- 成功     
exec sp_executesql @s   -- 此句正确 

3. 输出参数 
declare @num int, @sql nvarchar(4000) 
set @sql='select count(*) from tableName' 
exec(@sql) 


--如何将exec执行结果放入变量中? 

declare @num int, @sql nvarchar(4000) 
set @sql='select @a=count(*) from tableName ' 
exec sp_executesql @sql,N'@a int output',@num output 
select @num 

#3


楼主的问题应该是很简单的,先根据表之间的关系把二个表联接起来,再加上用户输入的条件
如:
select * from Developer join Product on Developer.Developerid=Product.Developerid where 开发商等级='' and  开发商名称='' and 开发商产品=''

根据用户输入条件个数增减where后面的条件.

如果写成存储过程,一楼的做法是很好的.

#4


jf

#5


#1




--假设三个变量分别为:@v1,@v2,@v3

declare @v1 int,@v2 int, @v3 varchar(100)

select A.*,B.*
from A inner join B on A.ID=B.ID
where (@v1 is null or A.字段1=@v1)
  and (@v2 is null or A.字段2=@v2)
  and (@v3 is null or B.字段名=@v3)


当然也可以用动态SQL语句。

#2



动态sql语句基本语法 
1 :普通SQL语句可以用Exec执行 

eg:   Select * from tableName 
         Exec('select * from tableName') 
         Exec sp_executesql N'select * from tableName'    -- 请注意字符串前一定要加N 

2:字段名,表名,数据库名之类作为变量时,必须用动态SQL 

eg:   
declare @fname varchar(20) 
set @fname = 'FiledName' 
Select @fname from tableName              -- 错误,不会提示错误,但结果为固定值FiledName,并非所要。 
Exec('select ' + @fname + ' from tableName')     -- 请注意 加号前后的 单引号的边上加空格 

当然将字符串改成变量的形式也可 
declare @fname varchar(20) 
set @fname = 'FiledName' --设置字段名 

declare @s varchar(1000) 
set @s = 'select ' + @fname + ' from tableName' 
Exec(@s)                -- 成功 
exec sp_executesql @s   -- 此句会报错 



declare @s Nvarchar(1000)  -- 注意此处改为nvarchar(1000) 
set @s = 'select ' + @fname + ' from tableName' 
Exec(@s)                -- 成功     
exec sp_executesql @s   -- 此句正确 

3. 输出参数 
declare @num int, @sql nvarchar(4000) 
set @sql='select count(*) from tableName' 
exec(@sql) 


--如何将exec执行结果放入变量中? 

declare @num int, @sql nvarchar(4000) 
set @sql='select @a=count(*) from tableName ' 
exec sp_executesql @sql,N'@a int output',@num output 
select @num 

#3


楼主的问题应该是很简单的,先根据表之间的关系把二个表联接起来,再加上用户输入的条件
如:
select * from Developer join Product on Developer.Developerid=Product.Developerid where 开发商等级='' and  开发商名称='' and 开发商产品=''

根据用户输入条件个数增减where后面的条件.

如果写成存储过程,一楼的做法是很好的.

#4


jf

#5