Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.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
Tsql 我是否可以对连接中的多个表对同一列只应用一次谓词?_Tsql_Sql Server 2012 - Fatal编程技术网

Tsql 我是否可以对连接中的多个表对同一列只应用一次谓词?

Tsql 我是否可以对连接中的多个表对同一列只应用一次谓词?,tsql,sql-server-2012,Tsql,Sql Server 2012,我想将两个表连接在一起,并将另外两个表中的附加信息添加到两个查询表中的相同列中。我已经提出了下面的代码,这是可行的,但是我对必须为每个表添加另一个JOIN子句感到不舒服,因为如果我想加入/添加更多内容,这会使查询非常长 有没有一种方法可以组合它,这样我就可以只连接一次其他表(每次只需使用S和E别名) 一种方法是使用公共表表达式(CTE)-类似于: with cte as (SELECT J.JobId, J.StandardJobId, S.JobName,

我想将两个表连接在一起,并将另外两个表中的附加信息添加到两个查询表中的相同列中。我已经提出了下面的代码,这是可行的,但是我对必须为每个表添加另一个
JOIN
子句感到不舒服,因为如果我想加入/添加更多内容,这会使查询非常长

有没有一种方法可以组合它,这样我就可以只连接一次其他表(每次只需使用
S
E
别名)


一种方法是使用公共表表达式(CTE)-类似于:

with cte as
(SELECT J.JobId,
        J.StandardJobId,
        S.JobName,
        J.EngineerId,
        E.EngineerName,
        J.FollowUpJobId
 FROM Jobs J
 INNER JOIN StandardJobs S ON J.StandardJobId = S.StandardJobId
 INNER JOIN Engineers E ON E.EngineerId = J.EngineerId)
SELECT O.*,
       F.StandardJobId AS FollowUpStandardJobId,
       F.JobName AS FollowUpJobName,
       F.EngineerId AS FollowUpEngineerId,
       F.EngineerName AS FollowUpEngineerName
FROM CTE AS O
JOIN CTE AS F ON O.FollowUpJobId = F.JobId

一种方法是使用公共表表达式(CTE)-类似于:

with cte as
(SELECT J.JobId,
        J.StandardJobId,
        S.JobName,
        J.EngineerId,
        E.EngineerName,
        J.FollowUpJobId
 FROM Jobs J
 INNER JOIN StandardJobs S ON J.StandardJobId = S.StandardJobId
 INNER JOIN Engineers E ON E.EngineerId = J.EngineerId)
SELECT O.*,
       F.StandardJobId AS FollowUpStandardJobId,
       F.JobName AS FollowUpJobName,
       F.EngineerId AS FollowUpEngineerId,
       F.EngineerName AS FollowUpEngineerName
FROM CTE AS O
JOIN CTE AS F ON O.FollowUpJobId = F.JobId

一种方法是使用公共表表达式(CTE)-类似于:

with cte as
(SELECT J.JobId,
        J.StandardJobId,
        S.JobName,
        J.EngineerId,
        E.EngineerName,
        J.FollowUpJobId
 FROM Jobs J
 INNER JOIN StandardJobs S ON J.StandardJobId = S.StandardJobId
 INNER JOIN Engineers E ON E.EngineerId = J.EngineerId)
SELECT O.*,
       F.StandardJobId AS FollowUpStandardJobId,
       F.JobName AS FollowUpJobName,
       F.EngineerId AS FollowUpEngineerId,
       F.EngineerName AS FollowUpEngineerName
FROM CTE AS O
JOIN CTE AS F ON O.FollowUpJobId = F.JobId

一种方法是使用公共表表达式(CTE)-类似于:

with cte as
(SELECT J.JobId,
        J.StandardJobId,
        S.JobName,
        J.EngineerId,
        E.EngineerName,
        J.FollowUpJobId
 FROM Jobs J
 INNER JOIN StandardJobs S ON J.StandardJobId = S.StandardJobId
 INNER JOIN Engineers E ON E.EngineerId = J.EngineerId)
SELECT O.*,
       F.StandardJobId AS FollowUpStandardJobId,
       F.JobName AS FollowUpJobName,
       F.EngineerId AS FollowUpEngineerId,
       F.EngineerName AS FollowUpEngineerName
FROM CTE AS O
JOIN CTE AS F ON O.FollowUpJobId = F.JobId

不,每次需要单独的引用时,都无法避免连接相关表。问题在于,您不是在一般意义上使用表,而是使用每个表的特定行,更具体地说,就是那些匹配联接和WHERE条件的行

无法只指定一次对
StandardJobs
Engineers
的引用,因为您需要同时处理每个表中的两行,至少在给定示例中是这样


然而,根据您希望使用“附加表”的方向(更多引用
作业
或更多查找,如
标准作业
工程师
,对于给定的
作业
),Mark所示的CTE结构可能是最简单/最好的抽象方法。我发布这个答案主要是为了解释手头的问题。

不,每次需要单独的参考时,您都无法避免加入相关的表。问题在于,您不是在一般意义上使用表,而是使用每个表的特定行,更具体地说,就是那些匹配联接和WHERE条件的行

无法只指定一次对
StandardJobs
Engineers
的引用,因为您需要同时处理每个表中的两行,至少在给定示例中是这样


然而,根据您希望使用“附加表”的方向(更多引用
作业
或更多查找,如
标准作业
工程师
,对于给定的
作业
),Mark所示的CTE结构可能是最简单/最好的抽象方法。我发布这个答案主要是为了解释手头的问题。

不,每次需要单独的参考时,您都无法避免加入相关的表。问题在于,您不是在一般意义上使用表,而是使用每个表的特定行,更具体地说,就是那些匹配联接和WHERE条件的行

无法只指定一次对
StandardJobs
Engineers
的引用,因为您需要同时处理每个表中的两行,至少在给定示例中是这样


然而,根据您希望使用“附加表”的方向(更多引用
作业
或更多查找,如
标准作业
工程师
,对于给定的
作业
),Mark所示的CTE结构可能是最简单/最好的抽象方法。我发布这个答案主要是为了解释手头的问题。

不,每次需要单独的参考时,您都无法避免加入相关的表。问题在于,您不是在一般意义上使用表,而是使用每个表的特定行,更具体地说,就是那些匹配联接和WHERE条件的行

无法只指定一次对
StandardJobs
Engineers
的引用,因为您需要同时处理每个表中的两行,至少在给定示例中是这样


然而,根据您希望使用“附加表”的方向(更多引用
作业
或更多查找,如
标准作业
工程师
,对于给定的
作业
),Mark所示的CTE结构可能是最简单/最好的抽象方法。我发布此答案主要是为了解释手头的问题。

您可以使用CTE(公共表表达式,
with
子句)或视图来完成此操作:

;WITH Jobs_Extended As
(
    SELECT  j.*,
            s.JobName,
            E.EngineerName
    FROM    Jobs         As j
    JOIN    StandardJobs As s   ON s.StandardJobId = j.StandardJobId
    JOIN    Engineer     As e   ON e.EngineerId = j.EngineerId
)
SELECT
    J.JobId,
    J.StandardJobId,
    J.JobName,
    J.EngineerId,
    J.EngineerName,
    JF.JobId         AS FollowUpJobId,
    JF.StandardJobId AS FollowUpStandardJobId,
    JF.JobName       AS FollowUpJobName,
    JF.EngineerId    AS FollowUpEngineerId,
    JF.EngineerName  AS FollowUpEngineerName
FROM    Jobs_Extended   J
JOIN    Jobs_Extended   JF  ON  J.FollowUpJobId = JF.JobId
在此示例中,CTE
Jobs\u Extended
成为作业、工程师和标准作业表之间关系的定义别名。一旦定义,您就可以在查询中多次使用它,而无需重新定义这些内部关系


您可以通过将
WITH
更改为视图来执行相同的操作,这将使定义的别名在您的数据库中成为permannet。

您可以通过CTE(公共表表达式,
WITH
子句)或视图来执行此操作:

;WITH Jobs_Extended As
(
    SELECT  j.*,
            s.JobName,
            E.EngineerName
    FROM    Jobs         As j
    JOIN    StandardJobs As s   ON s.StandardJobId = j.StandardJobId
    JOIN    Engineer     As e   ON e.EngineerId = j.EngineerId
)
SELECT
    J.JobId,
    J.StandardJobId,
    J.JobName,
    J.EngineerId,
    J.EngineerName,
    JF.JobId         AS FollowUpJobId,
    JF.StandardJobId AS FollowUpStandardJobId,
    JF.JobName       AS FollowUpJobName,
    JF.EngineerId    AS FollowUpEngineerId,
    JF.EngineerName  AS FollowUpEngineerName
FROM    Jobs_Extended   J
JOIN    Jobs_Extended   JF  ON  J.FollowUpJobId = JF.JobId
在此示例中,CTE
Jobs\u Extended
成为作业、工程师和标准作业表之间关系的定义别名。一旦定义,您就可以在查询中多次使用它,而无需重新定义这些内部关系


您可以通过将
WITH
更改为视图来执行相同的操作,这将使定义的别名在您的数据库中成为permannet。

您可以通过CTE(公共表表达式,
WITH
子句)或视图来执行此操作:

;WITH Jobs_Extended As
(
    SELECT  j.*,
            s.JobName,
            E.EngineerName
    FROM    Jobs         As j
    JOIN    StandardJobs As s   ON s.StandardJobId = j.StandardJobId
    JOIN    Engineer     As e   ON e.EngineerId = j.EngineerId
)
SELECT
    J.JobId,
    J.StandardJobId,
    J.JobName,
    J.EngineerId,
    J.EngineerName,
    JF.JobId         AS FollowUpJobId,
    JF.StandardJobId AS FollowUpStandardJobId,
    JF.JobName       AS FollowUpJobName,
    JF.EngineerId    AS FollowUpEngineerId,
    JF.EngineerName  AS FollowUpEngineerName
FROM    Jobs_Extended   J
JOIN    Jobs_Extended   JF  ON  J.FollowUpJobId = JF.JobId
在此示例中,CTE
Jobs\u Extended
成为作业、工程师和Stan之间关系的定义别名