【问题标题】:SQL Query Inner Join with Temp Table带有临时表的 SQL 查询内部联接
【发布时间】:2013-10-20 23:34:36
【问题描述】:

我正在尝试使用此处显示的示例在临时表中设置值:SQL output: Is it possible to create a temporary output column?

我已经创建了我的初始表,在该表中我使用列名来填充新的值列“operdesc”。

这是我获得所需 COLUMN_NAME 值的工作表查询。我想添加一个临时列“操作数”:

SELECT     COLUMN_NAME, DATA_TYPE, 'OPERAND' AS TempField, 
                  CASE WHEN COLUMN_NAME = 'Street' THEN '=' WHEN COLUMN_NAME = 'Town' THEN 'CW' END AS OPERAND FROM         INFORMATION_SCHEMA.COLUMNS WHERE    (TABLE_SCHEMA = 'dbo') AND (TABLE_NAME = 'Customers') ORDER BY COLUMN_NAME

但是,我想更进一步,并使用临时连接对其进行简化。我遵循了这个例子:SQL output: Is it possible to create a temporary output column?,但我挂断了我的脚本。这就是我所拥有的,但它不起作用,希望我很接近:

WITH XOperLU (xopername, xoperdesc)
 AS
 (
  SELECT xopername, CAST(xoperdesc AS VARCHAR(20))
    FROM (
          VALUES ('Street', 'SS'), 
                 ('Town', 'TW')                    
         ) AS XOperLU (xopername, xoperdesc)
 ) SELECT COLUMN_NAME as T1.COLUMN_NAME, DATA_TYPE as T1.DATA_TYPE, S1.xoperdesc AS Description FROM INFORMATION_SCHEMA.COLUMNS  AS T1 WHERE    (TABLE_SCHEMA = 'dbo') AND (TABLE_NAME = 'Clients') 
   INNER JOIN XOperLU AS S1
      ON S1.xopername = T1.COLUMN_NAME;

“客户”表是一个视图。

提前非常感谢!

【问题讨论】:

    标签: sql sql-server inner-join common-table-expression


    【解决方案1】:

    您几乎没问题,但您在列别名而不是列中使用了 T1 别名,最重要的是,您在 JOIN 之前使用了 WHERE。这有效:

    WITH XOperLU (xopername, xoperdesc)
     AS
     (
      SELECT xopername, CAST(xoperdesc AS VARCHAR(20))
        FROM (
              VALUES ('Street', 'SS'), 
                     ('Town', 'TW')                    
             ) AS XOperLU (xopername, xoperdesc)
     ) SELECT T1.COLUMN_NAME as COLUMN_NAME, T1.DATA_TYPE as DATA_TYPE, S1.xoperdesc AS Description FROM INFORMATION_SCHEMA.COLUMNS  AS T1 
       INNER JOIN XOperLU AS S1
          ON S1.xopername = T1.COLUMN_NAME
          WHERE    (TABLE_SCHEMA = 'dbo') AND (TABLE_NAME = 'Clients')
    

    如果您想查看所有其他未指定要设置描述的列,例如'XX',你可以使用左连接:

    WITH XOperLU (xopername, xoperdesc)
     AS
     (
      SELECT xopername, CAST(xoperdesc AS VARCHAR(20))
        FROM (
              VALUES ('Street', 'SS'), 
                     ('Town', 'TW')                    
             ) AS XOperLU (xopername, xoperdesc)
     ) SELECT T1.COLUMN_NAME as COLUMN_NAME, T1.DATA_TYPE as DATA_TYPE, ISNULL(S1.xoperdesc,'XX') AS Description FROM INFORMATION_SCHEMA.COLUMNS  AS T1 
       LEFT JOIN XOperLU AS S1
          ON S1.xopername = T1.COLUMN_NAME
          WHERE    (TABLE_SCHEMA = 'dbo') AND (TABLE_NAME = 'Clients')
    

    【讨论】:

    • 谢谢!第二组眼睛效果很好。现在唯一需要的调整是让我看到原始 COLUMN_NAME 中的所有记录,并按照定义设置“描述”中的其余记录(因为我有“街道”、“SS”)。这将在“描述”中为它们创建 NULL 值。我想定义一个默认值'XX',所以它不会说空。有意义吗?谢谢!
    • 谢谢。有没有办法对其进行调整,以便我看到所有记录(COLUMN_NAMES)的描述设置为“XX”,而我没有为其设置值?
    • 太棒了!非常感谢,工作得很好。我错过了 LEFT JOIN。
    • 我希望有一个增量 ID 字段。在上面的哪里添加 SELECT INTO 语句?提前致谢。
    猜你喜欢
    • 2018-12-08
    • 1970-01-01
    • 2011-04-21
    • 1970-01-01
    • 1970-01-01
    • 2018-09-15
    • 2018-09-14
    • 2011-12-17
    • 1970-01-01
    相关资源
    最近更新 更多