选择替换,然后加入

时间:2019-01-15 15:44:57

标签: sql sql-server

我有两个表要合并。

第一个表具有一个关键记录列ITEMID,其中关键记录具有后缀ITEMID_CV,并且该表包含我想要的另一列数据。第二个表具有相同的键记录,但后缀ITEMID_PH和其余的数据列不同。

对于第一个表,我可以使用:

SELECT 
    REPLACE (ITEMID,'CV','PH') AS ITEMID, 
    CAST (ENDDATE AS DATETIME) AS ENDDATE 
FROM PLTReports 

这给了我ITEMID的名字,它与第二张表相同。所以我在那儿。现在我不知道该怎么做,就是将这个结果连接到其他表的其余部分。以下给我一个模棱两可的列名错误。错误是: 错误--------------------

  

无法链接到外部表:意外的服务器错误:'Deferred   准备工作无法完成。无法准备声明。   列名称“ ITEMID”不明确。使用事件查看器查看PI AF   服务器日志文件以获取更多信息。

我想我可能已经解决了这个问题,但实际上并没有找到执行该操作的示例,并且我可能使用了错误的语法。

SELECT 
    REPLACE (ITEMID,'CV','PH') AS ITEMID, 
    CAST (ENDDATE AS DATETIME) AS ENDDATE 
FROM PLTReports 
INNER JOIN PRODUCTION_ALL ON PRODUCTION_ALL.ITEMID = PLTReports.ITEMID

有人对如何做到这一点有策略吗?这可能很简单,但我还没到那儿。

编辑:这是用于在PI AF中创建链接表,我无法立即回忆它使用哪种SQL。

4 个答案:

答案 0 :(得分:1)

您几乎拥有解决方案:

SELECT 
    REPLACE (ITEMID,'CV','PH') AS ITEMID, 
    CAST (ENDDATE AS DATETIME) AS ENDDATE 
FROM PLTReports 
INNER JOIN PRODUCTION_ALL 
    ON PRODUCTION_ALL.ITEMID = REPLACE(PLTReports.ITEMID,'CV','PH')

答案 1 :(得分:1)

如果我对您的理解正确,则需要在连接条件中使用 searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextChange(String query) { ImageView searchViewIcon = (ImageView)searchView.findViewById(android.support.v7.appcompat.R.id.search_close_btn); searchViewIcon.setVisibility(View.GONE); return true; } }); 。另外,具有相同名称的字段必须加上前缀:

REPLACE

答案 2 :(得分:0)

由于两个表都有一个“ ITEMID”,因此您需要指定REPLACE()应该使用的表:

REPLACE (PLTReports.ITEMID,'CV','PH') AS ITEMID,

但是我想根据您的意思,您还必须调整PRODUCTION_ALL.ITEMID = PLTReports.ITEMID,因为正如您所说的

  

第二个表具有相同的键记录,但后缀不同

因此,您也需要替换联接条件:

PRODUCTION_ALL.ITEMID = REPLACE(PLTReports.ITEMID,'CV','PH')

令人遗憾的是,这效率很低,因为必须生成来自REPLACE的临时未索引结果集;这就是为什么不幸的是您的索引不匹配。

答案 3 :(得分:-1)

没有太多的输入,我想这就是你的

SELECT
    x.ITEMID
    , x.ENDDATE
FROM
    (
        SELECT 
            REPLACE (ITEMID,'CV','PH') AS ITEMID, 
            CAST (ENDDATE AS DATETIME) AS ENDDATE 
        FROM PLTReports 
    ) x 
INNER JOIN PRODUCTION_ALL ON PRODUCTION_ALL.ITEMID = x.ITEMID

您也可以用这种方法来做,这可能会无限改善

; with cte AS 
    (
        SELECT 
            REPLACE (ITEMID,'CV','PH') AS ITEMID, 
            CAST (ENDDATE AS DATETIME) AS ENDDATE 
        FROM PLTReports 
    )
SELECT 
    cte.ITEMID
    , ENNDATE
    , PRODUCTION_ALL.*
FROM cte 
    INNER JOIN PRODUCTION_ALL ON cte.ITEMID = PRODUCTION_ALL.ITEMID