Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用Case语句有条件地修改联接数_Sql_Dynamic - Fatal编程技术网

Sql 使用Case语句有条件地修改联接数

Sql 使用Case语句有条件地修改联接数,sql,dynamic,Sql,Dynamic,我正在编写一个使用动态sql的存储过程。如果用户组为“Initial”,我希望能够有条件地添加第一个连接条件。下面不是实际的代码,它只是显示我的问题 SELECT A FROM MyTable IF UserGroup <> 'Initial THEN INNER JOIN Table1 ON MyTable.A = Table1.A END INNER JOIN Table1 ON MyTable.B = Table1.B INNER JOIN Ta

我正在编写一个使用动态sql的存储过程。如果用户组为“Initial”,我希望能够有条件地添加第一个连接条件。下面不是实际的代码,它只是显示我的问题

SELECT A FROM MyTable
   IF UserGroup <> 'Initial THEN
    INNER JOIN Table1 ON MyTable.A = Table1.A
   END
   INNER JOIN Table1 ON MyTable.B = Table1.B
   INNER JOIN Table1 ON MyTable.C = Table1.C

下面是如何使用外部联接获得相同结果的示例:

SELECT A
FROM MyTable 
LEFT JOIN Table1 T1 
   ON (UserGroup <> 'Initial' AND MyTable.A = T1.A) 
INNER JOIN Table1 T2 ON MyTable.B = T2.B 
INNER JOIN Table1 T3 ON MyTable.C = T3.C
WHERE (UserGroup <> 'Initial' AND T1.A IS NOT NULL) OR UserGroup = 'Initial'

正确的方法应该是:

select A from MyTable
inner join Table1 on 
  MyTable.A = case when UserGroup <> 'Initial' then Table1.A else MyTable.A end 
  or MyTable.B = Table1.B 
  or MyTable.C = Table1.C

您可以根据需要将实际或更改为和。

您可以使用动态sql

declare @Query varchar(max)

set @Query = ' SELECT A         
         FROM myTable
           '

 if (UserGroup <> 'Initial')  
   Begin
     set @Query = @Query +'INNER JOIN Table1 ON MyTable.A = Table1.A'
   End

exec(@Query)

在标准SQL中,每个查询都有一个固定的形状-源表是固定的,结果中列的数量、类型和名称是固定的。您可以使用一些特定的语言扩展或动态SQL,但我们需要知道您使用的是哪种SQL产品。请添加一个合适的标签。仅供我参考。你用过这个吗?只是想知道这是否有效。@Ashutsharya它在MSSQL中有效。你还没有说你正在使用什么数据库,所以我不能确定它是否能与你的数据库一起工作,但就是这样。在MS SQL中,on可以与通常的where In联接互换使用。@Ashutsharya是的,但是什么SQL server?有很多SQL server软件——PostgreSQL、MySQL、MS SQL等等。他们在某些方面都不同。为什么不试试呢?@LittleSweetSeas不一定。执行计划通常在第一次运行SQL variant时也会被缓存,并且您仍然可以将参数传递给exec的查询。动态SQL并不都是坏的。你只需要更加小心。