将一个数据表中的值用作另一表的输入,其中sql中的命令

问题描述 投票:0回答:1

我有这个示例查询,在该查询中,我希望将在表1的列(var5)中提取的数据作为表2中where命令的输入,然后联接表。你能告诉我怎么做吗。当前的问题是表2末尾的最后一条命令。 dbo.var4 IN ( t1.var5 )

SELECT DISTINCT
    t1.var1, t1.var2, t1.var3, t1.var4, t1.var5, 
    t2. var1, t2.var2, t2.var3
FROM
    /*table 1 = t1*/
    (SELECT
         dbo.var1, dbo.var2, dbo.var3,
         dbo.var4, dbo.var5,
     FROM
         dbo.data_table1 
     INNER JOIN 
         dbo.data_table2 ON (dbo.data_table2.var1 = dbo.data_table1.var1)
     WHERE
         (dbo.var1 IN ('name1')
          AND dbo.var2 IN ('Y')
          AND dbo.var3 IN ('Y')
          AND dbo.var4 IN ('Y'))) AS t1
    LEFT OUTER JOIN  
        /*--------------------------- 2. table 2 ---------------------------*/
        (SELECT
             dbo.var1, dbo.var2, dbo.var3,
         FROM
             dbo.data_table3 
         INNER JOIN 
             dbo.data_table4 ON (dbo.data_table4.var1 = dbo.data_table3.var4)
         WHERE
             (dbo.var1 IN (-1)
              AND dbo.var2 IN ('Y')
              AND dbo.var4 IN (t1.var5))) AS t2 ON t2.var4 = t1.var5   

谢谢

sql
1个回答
1
投票

在回答您的问题之前,我想对您的问题作一些评论。

  1. 以后,请使用您正在使用的特定DBMS标记您的问题。由于查询在表中使用dbo架构,因此我假设您正在使用Microsoft SQL Server。因此,我的答案将集中在Microsoft SQL Server上。

  2. 您还可以在查询中直接将前缀dbo.与列名一起使用。表名似乎丢失,这将导致错误。在我的回答中,我删除了所有无效的dbo用法;您将需要自己重新添加full前缀(就像在JOIN中所做的一样)。

  3. 表表达式t1t2的SELECT子句不完整且无效,因为它们以逗号结尾。这也会导致错误。我在答案中删除了这些逗号。

此外,我想了解为什么仅比较单个值时为什么使用IN运算符而不是=运算符。当然,这是完全有效的,但是似乎没有必要。我一直将它们保留在我的答案中,因为您似乎更喜欢它们。

解决方案1:

您需要在表表达式var4的SELECT子句中包含t2,以便从“外部”(主查询)可以看到它,从而可以在连接之间的ON部分中使用t1t2

SELECT DISTINCT
    t1.var1, t1.var2, t1.var3, t1.var4, t1.var5, 
    t2. var1, t2.var2, t2.var3
FROM
    /*table 1 = t1*/
    (SELECT
         var1, var2, var3,
         var4, var5
     FROM
         dbo.data_table1 
     INNER JOIN 
         dbo.data_table2 ON dbo.data_table2.var1 = dbo.data_table1.var1
     WHERE
         var1 IN ('name1')
         AND var2 IN ('Y')
         AND var3 IN ('Y')
         AND var4 IN ('Y')) AS t1
    LEFT OUTER JOIN
        /*--------------------------- 2. table 2 ---------------------------*/
        (SELECT
             var1, var2, var3, var4
         FROM
             dbo.data_table3 
         INNER JOIN 
             dbo.data_table4 ON dbo.data_table4.var1 = dbo.data_table3.var4
         WHERE
             var1 IN (-1)
             AND var2 IN ('Y')) AS t2 ON t2.var4 = t1.var5

解决方案2:

或者,您可以使用OUTER APPLY代替LEFT JOIN

SELECT DISTINCT
    t1.var1, t1.var2, t1.var3, t1.var4, t1.var5, 
    t2. var1, t2.var2, t2.var3
FROM
    /*table 1 = t1*/
    (SELECT
         var1, var2, var3,
         var4, var5
     FROM
         dbo.data_table1 
     INNER JOIN 
         dbo.data_table2 ON dbo.data_table2.var1 = dbo.data_table1.var1
     WHERE
         var1 IN ('name1')
         AND var2 IN ('Y')
         AND var3 IN ('Y')
         AND var4 IN ('Y')) AS t1
    OUTER APPLY
        /*--------------------------- 2. table 2 ---------------------------*/
        (SELECT
             var1, var2, var3, var4
         FROM
             dbo.data_table3 
         INNER JOIN 
             dbo.data_table4 ON dbo.data_table4.var1 = dbo.data_table3.var4
         WHERE
             var1 IN (-1)
             AND var2 IN ('Y')
             AND var4 IN (t1.var5)) AS t2
© www.soinside.com 2019 - 2024. All rights reserved.