首页 > 解决方案 > 使用一个数据表中的值作为另一个表的输入,其中 sql 中的命令

问题描述

我有这个示例查询,我希望在 table1 的列 (var5) 中提取数据作为 table2 中 where 命令的输入,然后加入表。你能告诉我怎么做吗?手头的问题是 table2 末尾的最后一个 where 命令。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. 将来,请使用您正在使用的特定 DBMS 标记您的问题。由于您的查询使用的是dbo带有表的架构,因此我假设您使用的是 Microsoft SQL Server。所以我的回答将集中在 Microsoft SQL Server 上。

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

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

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

解决方案1:

您需要包含var4在表表达式的 SELECT 子句中t2,以便它从“外部”(主查询)中可见,因此可以用于和之间的连接的 ONt1部分t2

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

推荐阅读