SQL 相当于无法 JOIN 时从 WHERE EXISTS 返回值

Ben*_* CA 4 sql-server-2008 sql-server

试图弄清楚如何在有效的 SQL (MS SQL Server) 中编写以下伪代码:

SELECT 
  T1.Item,
  T1.Set,
  Has.SN
FROM T1
 WHERE EXISTS
(SELECT SN FROM T2 WHERE Condition = 'X') AS Has
Run Code Online (Sandbox Code Playgroud)

本质上,如果 T2 上存在 SN,则返回 SN 以及来自 T1 的不相关值。如果SN不存在,则不应返回任何数据(或者可以全部返回NULL)

但 Item 和 Set 必须与 T1 上的同一行相关,并且我还需要返回 SN。(我不确定如果使用单独的 CASE 语句是否能保证这一点。)

没有任何与 JOIN T1 和 T2 相关的内容。

(请注意,这只是作为查询的一个子组件,我需要它以一种可以在其他联接中使用的方式返回这 3 列。)

我认为有一个非常简单的解决方案,但我却一片空白。

我做了一些搜索,但没有找到任何与此类似的示例。

更新

所以样本数据如下:

T1

+----+---------+-----+
| ID | ItemID  | Set |
+----+---------+-----+
| 1  | 2424424 | 4   |
+----+---------+-----+
| 2  | 2454677 | 7   |
+----+---------+-----+
Run Code Online (Sandbox Code Playgroud)

T2

+----+-----------+-----------+
| ID | SN        | Condition |
+----+-----------+-----------+
| 1  | SN0284202 | X         |
+----+-----------+-----------+
| 2  | SN1902552 | NULL      |
+----+-----------+-----------+
Run Code Online (Sandbox Code Playgroud)

我想基本上,我需要为每个项目返回一个单独的行,并为每个符合条件的 SN 设置。因此,如果 T1 上有 1000 行,T2 上有 100 行,但只有 10 行符合条件,则应该返回 10,000 行。(10 个 SN 中的每一个 1000 个项目)显然这可能会产生一个大型数据集,但它只是用于子查询特定数据。

结果示例

+---------+-----+-----------+
| ItemID  | Set | SN        |
+---------+-----+-----------+
| 2424424 | 4   | SN0284202 |
+---------+-----+-----------+
| 2454677 | 7   | SN0284202 |
+---------+-----+-----------+
Run Code Online (Sandbox Code Playgroud)

Eri*_*ing 6

这可能就是您正在寻找的:

SELECT 
    T1.Item,
    T1.[Set],
    Has.SN
FROM T1
CROSS JOIN
(
    SELECT 
        SN 
    FROM T2 
    WHERE Condition = 'X'
) AS Has;
Run Code Online (Sandbox Code Playgroud)

您无法投影 EXISTS 部分中的列,因为选择列表中的项目不会投影到任何地方。

例如,如果您将原始查询更改为实用的查询:

SELECT 
    T1.Item,
    T1.[Set]
FROM T1
WHERE EXISTS
(
    SELECT 
        1/0 
    FROM T2 
    WHERE Condition = 'X'
);
Run Code Online (Sandbox Code Playgroud)

1/0 通常会产生除以零的结果,但在本例中不会,因为它不是由优化器计算的。