有没有办法在FROM子句中使用多个源表而不在SQL Server中使用JOIN?
我可以在FROM子句中实现一个嵌套的SELECT语句,如下所示:有没有办法在FROM子句中使用多个源表而不在SQL Server中使用JOIN?,sql,sql-server,Sql,Sql Server,我可以在FROM子句中实现一个嵌套的SELECT语句,如下所示: SELECT [table1].[ID] as [table_1_ID] FROM (SELECT [ID] FROM [the_table_1] WHERE [address] like 'street5' ) as [table1] 理想情况下,我希望在FROM子句中添加多个类似的嵌套SELECT语句,而不使用join,从而得到类似的结果(下面的代码显然不起作用) (从每个源表中,我只需要一个值。WHERE子句就是这样做的
SELECT [table1].[ID] as [table_1_ID]
FROM
(SELECT [ID] FROM [the_table_1] WHERE [address] like 'street5' ) as [table1]
理想情况下,我希望在FROM子句中添加多个类似的嵌套SELECT语句,而不使用join,从而得到类似的结果(下面的代码显然不起作用)
(从每个源表中,我只需要一个值。WHERE子句就是这样做的。)
我知道如何使用JOIN,但出于某种原因,我希望在不使用JOIN的情况下使用。
在SQL Server中是否可能实现这种情况?如果可以保证子查询只返回一个值,则可以将select嵌套在select中。你根本不需要来自的
(我已经用=
替换了你的如
):
从技术上讲,您不必强制执行此担保。但是,如果您碰巧在select中为一个子查询返回了多行,则带有throw a子查询的SQL返回了多个值。因此,要么在地址上设置一个唯一的约束,要么在每个子选择中添加一些保证只返回一行的内容。如果可以保证子查询只返回一个值,则可以将选择嵌套在选择中。你根本不需要来自
的(我已经用=
替换了你的如
):
从技术上讲,您不必强制执行此担保。但是,如果您碰巧在select中为一个子查询返回了多行,则带有throw a子查询的SQL返回了多个值。因此,要么在地址上设置一个唯一的约束,要么在每个子选择中添加一些保证只返回一行的内容。这是一种自1992年SQL-92标准发布以来就不鼓励使用的样式-不要开始使用它-一定要使用正确的ANSI/ISO连接@谢谢你。你是说使用存储过程?那有可能吗?我知道这不是一个好方法,它只是一个特定应用程序的测试。实际上,要将查询时间与JOIN方法进行比较,这里仍然有一个连接
,它被称为交叉连接
。但是您似乎认为可以使用3部分命名在子查询内部进行引用<代码>[nested_selects].[table1].[ID]
不会引用内部子查询表中的列ID
,外部子查询nested_selects
;它将尝试引用模式嵌套\u selects
中对象表1
中的列ID
(在查询的该部分上下文中不存在)。这感觉像是一场灾难。您在这里试图解决的实际问题是什么?不-如果您以任何方式“组合”表,那么您就是在连接它们-这取决于您用来表达这一点的语法风格-坚持正确、明确的JOIN
,而不是混乱、陈旧、令人沮丧的其他方式…对于某些场景,您可以对单独选择的行使用交叉应用
,以获得与常规联接大致相同的效果。但是,根据查询的不同,这可能远不如进行适当的连接有效。当真正的问题是由于缺少(唯一的)索引、过时的统计数据或数据分布不均,引擎不知道如何有效地执行连接时,人们通常认为“连接速度慢”。正确地解决这些问题所带来的好处远远超过了不遗余力地猜测引擎。自1992年SQL-92标准发布以来,一直不鼓励使用这种风格——不要开始使用它——一定要使用正确的ANSI/ISOJOIN
s@谢谢你。你是说使用存储过程?那有可能吗?我知道这不是一个好方法,它只是一个特定应用程序的测试。实际上,要将查询时间与JOIN方法进行比较,这里仍然有一个连接
,它被称为交叉连接
。但是您似乎认为可以使用3部分命名在子查询内部进行引用<代码>[nested_selects].[table1].[ID]
不会引用内部子查询表中的列ID
,外部子查询nested_selects
;它将尝试引用模式嵌套\u selects
中对象表1
中的列ID
(在查询的该部分上下文中不存在)。这感觉像是一场灾难。您在这里试图解决的实际问题是什么?不-如果您以任何方式“组合”表,那么您就是在连接它们-这取决于您用来表达这一点的语法风格-坚持正确、明确的JOIN
,而不是混乱、陈旧、令人沮丧的其他方式…对于某些场景,您可以对单独选择的行使用交叉应用
,以获得与常规联接大致相同的效果。但是,根据查询的不同,这可能远不如进行适当的连接有效。当真正的问题是由于缺少(唯一的)索引、过时的统计数据或数据分布不均,引擎不知道如何有效地执行连接时,人们通常认为“连接速度慢”。正确地解决这些问题所带来的好处远远超过你对引擎的猜测。谢谢。它回答了我的问题。为了避免“超过1个值”的问题,我刚刚添加了DISTINCT,它可以工作从[U表…
中选择DISTINCT[ID],这不能保证单一值结果。给定地址可能有多个不同的ID值:创建表t(ID int,address varchar(20);插入t值(1,'street5'),(2,'street5'));从t中选择distinct ID,其中address='street5';
您可以使用top 1
之类的运算符或min()或之类的聚合函数来保证单行
SELECT [nested_selects].[table1].[ID] as [table_1_ID],
[nested_selects].[table2].[ID] as [table_2_ID]
FROM (
(SELECT [ID] FROM [the_table_1] WHERE [address] like 'street5' ) as [table1],
(SELECT [ID] FROM [the_table_2] WHERE [address] like 'street5' ) as [table2]
) as [nested_selects]
select
table_1_id = (SELECT [ID] FROM [the_table_1] WHERE [address] = 'street5' ),
table_2_id = (SELECT [ID] FROM [the_table_2] WHERE [address] = 'street5' );