有没有办法在FROM子句中使用多个源表而不在SQL Server中使用JOIN?

有没有办法在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子句就是这样做的

我可以在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子句就是这样做的。)

我知道如何使用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/ISO
JOIN
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' );