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)
这可能就是您正在寻找的:
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 通常会产生除以零的结果,但在本例中不会,因为它不是由优化器计算的。
归档时间: |
|
查看次数: |
748 次 |
最近记录: |