Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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 server TSQL决策语句_Sql Server_Sql Server 2008_Tsql - Fatal编程技术网

Sql server TSQL决策语句

Sql server TSQL决策语句,sql-server,sql-server-2008,tsql,Sql Server,Sql Server 2008,Tsql,我有一个视图,可以选择您可以看到的许多字段。不过,查询的主要焦点是xro_roles.start_页面。此字段包含存储过程要引用的起始页链接。但我有第二个表,它也包含一些链接(这个表称为分支)。如果dbo.people.role_id=1,那么我需要它为start_页面列使用branchs表。如果role_id不是1,那么它应该引用xro_roles.start_页面 我不确定在这个场景中如何使用CASE语句。如果我没有提供足够的信息,请告诉我 谢谢 SELECT dbo.people.peo

我有一个视图,可以选择您可以看到的许多字段。不过,查询的主要焦点是xro_roles.start_页面。此字段包含存储过程要引用的起始页链接。但我有第二个表,它也包含一些链接(这个表称为分支)。如果dbo.people.role_id=1,那么我需要它为start_页面列使用branchs表。如果role_id不是1,那么它应该引用xro_roles.start_页面

我不确定在这个场景中如何使用CASE语句。如果我没有提供足够的信息,请告诉我

谢谢

 SELECT dbo.people.people_id, dbo.people.role_id, dbo.people.company_id, 
           dbo.xro_roles.start_page, dbo.areas.area_id,
FROM dbo.areas RIGHT OUTER JOIN
          dbo.divisions ON dbo.areas.area_id = dbo.divisions.area_id RIGHT OUTER JOIN
          dbo.people LEFT OUTER JOIN
          dbo.xro_roles ON dbo.people.role_id = dbo.xro_roles.role_id ON dbo.divisions.division_id = dbo.people.division_id LEFT OUTER JOIN
          dbo.companies ON dbo.people.company_id = dbo.companies.company_id LEFT OUTER JOIN
          dbo.xro_time_zones ON dbo.people.time_zone_id = dbo.xro_time_zones.time_zone_id
          LEFT OUTER JOIN dbo.branches ON dbo.branches.branch_id = dbo.people.division_id
WHERE (dbo.people.status_id IN (0, 1, 4))
(如果people.role\u id=1,则为branchs.start\u页面
else xro_roles.start_页面结束)
(如果people.role\u id=1,则为branchs.start\u页面
else xro_roles.start_页面结束)

首先清理sql。使用表格别名!不要混合使用左外连接和右外连接。在执行无序联接时使用括号(尽管在这种情况下,正如我在下面所示,您可以重新组织联接,以便不需要这样做)

假设Branchs表中的字段名为
start\u page
,请尝试以下操作: (第三行有案例陈述)


首先,清理sql。使用表格别名!不要混合使用左外连接和右外连接。在执行无序联接时使用括号(尽管在这种情况下,正如我在下面所示,您可以重新组织联接,以便不需要这样做)

假设Branchs表中的字段名为
start\u page
,请尝试以下操作: (第三行有案例陈述)


在查询的
选择部分中放置
大小写WHEN

SELECT  dbo.people.people_id
        , dbo.people.role_id
        , dbo.people.company_id
        , CASE WHEN dbo.people.role_id = 1
            THEN    dbo.branches.start_page     -- assuming the column name is "start_page"
            ELSE    dbo.xro_roles.start_page
          END AS some_field_name
        , dbo.areas.area_id
FROM    dbo.areas
        RIGHT OUTER JOIN dbo.divisions
            ON  dbo.areas.area_id = dbo.divisions.area_id
        RIGHT OUTER JOIN dbo.people
            ON  dbo.divisions.division_id = dbo.people.division_id      
        LEFT OUTER JOIN dbo.xro_roles
            ON  dbo.people.role_id = dbo.xro_roles.role_id
        LEFT OUTER JOIN dbo.companies
            ON  dbo.people.company_id = dbo.companies.company_id
        LEFT OUTER JOIN dbo.xro_time_zones
            ON  dbo.people.time_zone_id = dbo.xro_time_zones.time_zone_id
        LEFT OUTER JOIN dbo.branches
            ON  dbo.branches.branch_id = dbo.people.division_id
WHERE   dbo.people.status_id IN (0, 1, 4)
您也可以在
时使用
合并
而不是
案例,具体取决于您如何设置联接,但如果
dbo.people.status\u id
在其他情况下不是
1
,则可能无法获得所需的结果:

SELECT  dbo.people.people_id
        , dbo.people.role_id
        , dbo.people.company_id
        , COALESCE(dbo.branches.start_page, dbo.xro_roles.start_page) AS some_field_name
        , dbo.areas.area_id
FROM    dbo.areas
        RIGHT OUTER JOIN dbo.divisions
            ON  dbo.areas.area_id = dbo.divisions.area_id
        RIGHT OUTER JOIN dbo.people
            ON  dbo.divisions.division_id = dbo.people.division_id      
        LEFT OUTER JOIN dbo.xro_roles
            ON  dbo.people.role_id = dbo.xro_roles.role_id
        LEFT OUTER JOIN dbo.companies
            ON  dbo.people.company_id = dbo.companies.company_id
        LEFT OUTER JOIN dbo.xro_time_zones
            ON  dbo.people.time_zone_id = dbo.xro_time_zones.time_zone_id
        LEFT OUTER JOIN dbo.branches
            ON  dbo.branches.branch_id = dbo.people.division_id
            AND dbo.people.status_id = 1    -- This JOIN may not do what you want and is included only as an example.
WHERE   dbo.people.status_id IN (0, 1, 4)

在查询的
选择部分中放置
大小写WHEN

SELECT  dbo.people.people_id
        , dbo.people.role_id
        , dbo.people.company_id
        , CASE WHEN dbo.people.role_id = 1
            THEN    dbo.branches.start_page     -- assuming the column name is "start_page"
            ELSE    dbo.xro_roles.start_page
          END AS some_field_name
        , dbo.areas.area_id
FROM    dbo.areas
        RIGHT OUTER JOIN dbo.divisions
            ON  dbo.areas.area_id = dbo.divisions.area_id
        RIGHT OUTER JOIN dbo.people
            ON  dbo.divisions.division_id = dbo.people.division_id      
        LEFT OUTER JOIN dbo.xro_roles
            ON  dbo.people.role_id = dbo.xro_roles.role_id
        LEFT OUTER JOIN dbo.companies
            ON  dbo.people.company_id = dbo.companies.company_id
        LEFT OUTER JOIN dbo.xro_time_zones
            ON  dbo.people.time_zone_id = dbo.xro_time_zones.time_zone_id
        LEFT OUTER JOIN dbo.branches
            ON  dbo.branches.branch_id = dbo.people.division_id
WHERE   dbo.people.status_id IN (0, 1, 4)
您也可以在
时使用
合并
而不是
案例,具体取决于您如何设置联接,但如果
dbo.people.status\u id
在其他情况下不是
1
,则可能无法获得所需的结果:

SELECT  dbo.people.people_id
        , dbo.people.role_id
        , dbo.people.company_id
        , COALESCE(dbo.branches.start_page, dbo.xro_roles.start_page) AS some_field_name
        , dbo.areas.area_id
FROM    dbo.areas
        RIGHT OUTER JOIN dbo.divisions
            ON  dbo.areas.area_id = dbo.divisions.area_id
        RIGHT OUTER JOIN dbo.people
            ON  dbo.divisions.division_id = dbo.people.division_id      
        LEFT OUTER JOIN dbo.xro_roles
            ON  dbo.people.role_id = dbo.xro_roles.role_id
        LEFT OUTER JOIN dbo.companies
            ON  dbo.people.company_id = dbo.companies.company_id
        LEFT OUTER JOIN dbo.xro_time_zones
            ON  dbo.people.time_zone_id = dbo.xro_time_zones.time_zone_id
        LEFT OUTER JOIN dbo.branches
            ON  dbo.branches.branch_id = dbo.people.division_id
            AND dbo.people.status_id = 1    -- This JOIN may not do what you want and is included only as an example.
WHERE   dbo.people.status_id IN (0, 1, 4)


请您稍微清理一下,以便我们可以提供帮助。尝试提供一个简单的查询(使用别名而不是整个对象路径),并保留问题的最小字段。右连接,右连接,左连接,左连接,左连接,左连接?这是一个秘密的视频游戏代码,像上,下,上,下,右,左,a,b等等?显然…这不是我写的任何东西,只是清理东西。谢谢大家。你们能帮我清理一下吗?也许我们能帮上忙。试着提供一个简单的查询(使用别名而不是整个对象路径),并保留问题的最小字段。右连接,右连接,左连接,左连接,左连接?这是一个秘密的视频游戏代码,像上,下,上,下,右,左,a,b等等?显然…这不是我写的任何东西,只是清理东西。谢谢各位。sp_getTimeZoneABR和sp_getTimeZoneUSEstOffset函数是吗?为什么他们有一个sp前缀?@Aaron,在他编辑之前,他们在原来的帖子里,啊,好的。好吧,OP的问题也是一样。你不应该在任何事情上使用sp_uu前缀,尤其是那些不是过程的事情。@Aaron,他提到他从以前的开发人员那里继承了这个过程。我相信您已经知道,但为了完整起见,我将在这里添加
sp_uu
前缀,它是早期SQL server(甚至可能是SQL server之前的Sybase)遗留下来的,如果当前数据库中不存在具有该名称的进程,则会导致DB引擎在主数据库和当前数据库中查找。它代表“系统过程”,但不幸的是,许多早期开发人员误解了它的意思,认为它意味着“存储过程”,并将其用于他们自己的所有进程。将一个进程放入master中,使用这种命名约定,允许服务器上的所有数据库都使用它。微软在他们的系统过程中使用了这种技术。对于要在多个DBs中使用的一般过程,这对于单个开发人员来说仍然是一种很好的技术。除了在当前数据库中找不到进程时导致引擎查找master之外(并且暴露出未受过教育的熟练程度),我不知道这个错误还有什么其他不利之处。还有其他的吗?sp_getTimeZoneABR和sp_GetTimeZoneUseTofSet函数吗?为什么他们有一个sp前缀?@Aaron,在他编辑之前,他们在原来的帖子里,啊,好的。好吧,OP的问题也是一样。你不应该在任何事情上使用sp_uu前缀,尤其是那些不是过程的事情。@Aaron,他提到他从以前的开发人员那里继承了这个过程。我相信您已经知道,但为了完整起见,我将在这里添加
sp_uu
前缀,它是早期SQL server(甚至可能是SQL server之前的Sybase)遗留下来的,如果当前数据库中不存在具有该名称的进程,则会导致DB引擎在主数据库和当前数据库中查找。它代表“系统过程”,但不幸的是,许多早期开发人员误解了它的意思,认为它意味着“存储过程”,并将其用于他们自己的所有进程。将一个进程放入master中,使用这种命名约定,允许服务器上的所有数据库都使用它。微软在他们的系统过程中使用了这种技术。对于要在多个DBs中使用的一般过程,这对于单个开发人员来说仍然是一种很好的技术。除了在当前数据库中找不到进程时导致引擎查找master之外(并且暴露出未受过教育的熟练程度),我不知道这个错误还有什么其他不利之处。还有其他的吗?