sql - 使用一个数据表中的值作为另一个表的输入,其中 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
谢谢
解决方案
在回答你的问题之前,我想就你的问题做一些说明。
将来,请使用您正在使用的特定 DBMS 标记您的问题。由于您的查询使用的是
dbo
带有表的架构,因此我假设您使用的是 Microsoft SQL Server。所以我的回答将集中在 Microsoft SQL Server 上。您还可以在查询中直接将前缀
dbo.
与列名一起使用。似乎缺少表名,这将导致错误。在我的回答中,我删除了所有无效的dbo
用法;您将需要自己再次添加完整的前缀(就像您在 JOIN 中所做的那样)。表表达式的 SELECT 子句
t1
和t2
不完整且无效,因为它们以逗号结尾。这也会导致错误。我在答案中删除了这些逗号。
此外,我想了解在仅比较单个值时为什么使用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
推荐阅读
- python - wget.download 在尝试下载图像时引发 indexerror
- javascript - 生成按钮的 ON OFF 不起作用
- java - 使用 assertThat 测试列表列表是否包含特定元素
- authentication - Blazor Webassembly JWT 授权第一步
- node.js - Gatsby 3 – `gatsby build` 在“为页面构建静态 HTML”时失败,并出现错误“WebpackError: ReferenceError: ... is not defined”(firebase/app)
- python - 502 网关错误 django + gcloud
- visual-studio - Visual Studio 安装程序 - 不同机器上的 VS 安装之间的工作负载“差异”?
- tomcat - 解决 apache tomcat 负载平衡中的混淆问题
- linux - Go pipe write end 被关闭,为什么?
- powershell - ForEach-Object 以某种方式展平返回值