1

我仍然是 SQL 的 n00b 并且遇到了障碍。我所拥有的是根据某些条件将某些 ID 初始选择到临时表中:

SELECT DISTINCT ID
INTO #TEMPTABLE
FROM ICC
WHERE ICC_Code = 1 AND ICC_State = 'CA'

稍后在查询中,我选择了一个不同且更长的 ID 列表以及来自其他表的其他数据。该 SELECT 大约有 20 列宽,是我的结果集。我想做的是向该结果集中添加一个额外的列,该列的每个值都是 TRUE 或 FALSE。如果行中的 ID 在#TEMPTABLE 中,则附加列的值应为 TRUE。如果不是,则为假。这样,添加的列将在每行上准备好 TRUE 或 FALSE,具体取决于每行中的 ID 是否在#TEMPTABLE.

第二个 SELECT 将类似于:

SELECT ID,
       ColumnA,
       ColumnB,
       ...
       NEWCOLUMN
FROM ...

NEWCOLUMN 的每一行的值取决于返回的行中的 ID 是否在 #TEMPTABLE 中。

有人在这里有什么建议吗?

谢谢,

马特

4

4 回答 4

1

如果您离开加入#TEMPTABLE,您将获得一个 NULL,其中 ID 不存在

SELECT ID,
       ColumnA,
       ColumnB,
       ...
       T.ID IS NOT NULL AS NEWCOLUMN -- Gives 1 or 0 or True/false as a bit
FROM ... X
LEFT JOIN #TEMPTABLE T
ON T.ID = X.ID -- DEFINE how the two rows can be related unquiley
于 2012-12-12T02:21:21.423 回答
0

您可以使用联合和子查询。

Select . . . . , 'TRUE'
From . . .
Where ID in 
(Select id FROM #temptable)
UNION
SELECT . . . , 'FALSE'
FROM . . .
WHERE ID NOT in 
(Select id FROM #temptable)

因此,如果 ID 在您的临时表中,则顶部部分 SELECT ... FROM ... WHERE ID IN ( Subquery ) 会执行 SELECT 。

如果 ID不在temptable 中,则底部执行 SELECT 。

UNION 运算符很好地连接了两个结果,因为两个 SELECT 语句将返回相同数量的列。

于 2012-12-12T02:24:14.997 回答
0

您需要将您的结果查询左连接到#TEMPTABLE ON ID,如果有 ID,这将为您提供 ID,NULL如果没有,如果您想要 1 或 0,则可以这样做(对于 SQL Server)ISNULL(#TEMPTABLE .ID,0)<>0。

关于性能编码的一些注意事项:

  1. 根据定义,ID 列是唯一的,因此它DISTINCT是多余的并导致不必要的处理(除非它是来自另一个表的 ID)

  2. 为什么要将它存储到临时表中而不是直接在查询中使用它?

于 2012-12-12T02:20:12.877 回答
0

要扩展其他人对 Union 所说的内容,只需执行类似的操作

SELECT id, TRUE AS myColumn FROM  `table1` 
UNION 
SELECT id, FALSE AS myColumn FROM  `table2` 
于 2012-12-12T02:34:46.360 回答