如何使用select语句中一列的值来显示连接中的列?

时间:2016-08-05 14:30:30

标签: sql sql-server

这是我目前的SELECT声明:

SELECT DISTINCT [QVD/CSV Names] AS 'CSV/Excel Files',
                [SourceTypeID],
                CASE 
                    WHEN substring([QVD/CSV Names], len([QVD/CSV Names]) - 3, 4) = '.csv'   THEN 'CSV'
                    WHEN substring([QVD/CSV Names], len([QVD/CSV Names]) - 3, 4) = '.xls'   THEN 'Excel'
                    WHEN substring([QVD/CSV Names], len([QVD/CSV Names]) - 4, 5) = '.xlsx' THEN 'Excel'
                END
                AS [Source Types]
FROM STG_QVDs
LEFT OUTER JOIN SourceTypes AS c
    ON  [Source Types] = c.[SourceTypeName]
WHERE [QVD/CSV Names] IS NOT NULL
    AND substring([QVD/CSV Names], len([QVD/CSV Names]) - 3, 4) <> '.qvd'

现在,我有三列。一列将显示文件名CSV/Excel Files。另一个是假设显示源的ID(我使用case语句在另一列中的现场生成)。由于该列不在数据库中,我不得不在那里创建它,这就是我被困住的地方。我不想显示[Source Types]列。我只想要CSV/Excel FilesSourceTypeID。有没有办法让我能够使用生成的列显示行的相应ID?

这是它在SourceTypes查找表中的外观。

SourceTypeID    SourceTypeName
------------    --------------
      1              CSV
      2              Excel

这就是它显示的内容:

CSV/Excel Files    Source Types
---------------    ------------
   file1.csv          CSV
   file2.xls          Excel

我希望它显示:

CSV/Excel Files    SourceTypeID
---------------    ------------
   file1.csv          1
   file2.xls          2

2 个答案:

答案 0 :(得分:1)

您可以先在CTE(公用表表达式)中准备CSV / Excel值,然后将它们连接到查找表。这样的事情。

;with names as ( -- start CTE
SELECT DISTINCT [QVD/CSV Names] AS [CSV/Excel Files],
                CASE --"ends with"
                    WHEN [QVD/CSV Names] like '%.csv'  THEN 'CSV'
                    WHEN [QVD/CSV Names] like '%.xls'  THEN 'Excel'
                    WHEN [QVD/CSV Names] like '%.xlsx' THEN 'Excel'
                END
                AS [Source Types]
FROM STG_QVDs
WHERE [QVD/CSV Names] IS NOT NULL
    AND [QVD/CSV Names] not like '%.qvd'
) --end CTE
select names.[CSV/Excel Files], c.[SourceTypeID]
from names
LEFT OUTER JOIN SourceTypes AS c
    ON  names.[Source Types] = c.[SourceTypeName]

答案 1 :(得分:0)

您的代码无效,因为它会尝试在ON子句中引用列别名。好吧,如果已在其中一个表中定义[Source Types],它可能会编译并运行;但代码可能不会按你的意愿行事。

我想你打算:

SELECT DISTINCT [QVD/CSV Names] AS [CSV/Excel Files],
                [SourceTypeID],
FROM STG_QVDs LEFT OUTER JOIN
     SourceTypes c
     ON [QVD/CSV Names] LIKE '%.' + c.[SourceTypeName]
WHERE [QVD/CSV Names] IS NOT NULL AND
      [QVD/CSV Names] NOT LIKE '%.qvd';

注意:SELECT DISTINCT是可疑的。你可能根本不需要它。