2010-11-05 75 views
0

这里是一个查询,返回只有1列称为数据路径:不是选择的数据通路的SQL Server 2008:合并两个复杂的查询

SELECT --assumes number not at end of string 
    LEFT(startOf, PATINDEX('%[^0-9]%', startof)-1) 
FROM 
    (
    SELECT --assumed 3 digits minimum 
     SUBSTRING(datapath, PATINDEX('%[0-9][0-9][0-9]%', datapath), 8000) AS startOf 
    FROM 
     (select datapath from batchinfo where LEN(datapath)>3) as bar 
    ) foo 

在下面这个SELECT语句换句话说,我想运行上面SQL语句

SELECT reporttime, 
        datapath, 
        finalconc, 
        instrument 
        FROM batchinfo 
        JOIN qvalues ON batchinfo.rowid = qvalues.rowid 
        WHERE compound = 3 AND name = "hey" 
        AND batchinfo.instrument = 44 
        AND batchinfo.reporttime LIKE '10/%/2010%'"; 
+0

什么是你的数据路径查询,并batchinfo领​​域之间的联系? **你需要一种方法来说明哪些行匹配** – JNK 2010-11-05 17:47:06

+0

@jnk非常好的一点,逻辑是不是选择数据路径,而是我想选择数据路径的一个子集,数据路径的子集是第一个选择状态网 – 2010-11-05 17:49:35

+0

@我是女孩 - 我的意思是,你怎么知道哪个数据路径(从子集)匹配到批处理信息中的哪一行? – JNK 2010-11-05 17:50:39

回答

0

如果我正确地读这篇文章,我想你应该能够在第二选择你的第一选择值赋给你的“数据通路”列,并代表使用您为startOf选择的值花边'startOf'。

我认为这将是这样的:

SELECT 
    reporttime, 
    'datapath' = LEFT(SUBSTRING(datapath, PATINDEX('%[0-9][0-9][0-9]%', datapath), 8000), PATINDEX('%[^0-9]%', SUBSTRING(datapath, PATINDEX('%[0-9][0-9][0-9]%', datapath), 8000))-1) , 
    finalconc, 
    instrument 
FROM batchinfo 
JOIN qvalues ON batchinfo.rowid = qvalues.rowid 
WHERE compound = 3 AND name = "hey" 
AND batchinfo.instrument = 44 
AND batchinfo.reporttime LIKE '10/%/2010%'"; 
+1

令人印象深刻的重新格式化我的答案。和OP的[上一个](http://stackoverflow.com/questions/4108268/sql-server-2008-select-substring-from-a-field)现在添加CASE的“号码找不到”和“行结束的号码”。 – gbn 2010-11-05 18:19:51

3
SELECT reporttime, 
        datapath, 
        finalconc, 
        instrument 
     FROM 

(
SELECT --assumes number not at end of string 
    LEFT(startOf, PATINDEX('%[^0-9]%', startof)-1) AS datapath, --correct? 
    rowid, instrument , reporttime 
FROM 
    (
    SELECT --assumed 3 digits minimum 
     SUBSTRING(datapath, PATINDEX('%[0-9][0-9][0-9]%', datapath), 8000) AS startOf, 
     rowid, instrument , reporttime 
    FROM 
     batchinfo --don't need LEN check. PATINDEX will do that implicitly 
    ) foo 

) batchinfo 
        JOIN qvalues ON batchinfo.rowid = qvalues.rowid 
        WHERE compound = 3 AND name = "hey" 
        AND batchinfo.instrument = 44 
        AND batchinfo.reporttime LIKE '10/%/2010%'"; 
+0

@gbn你为什么对我这么好? – 2010-11-05 17:53:15

+0

@gbn btw我不认为你的patindex工作,因为它给了我错误,因为一些单元格的长度= 0 – 2010-11-05 17:53:53

+0

@我是一个女孩=添加一个'WHERE LEN(datapath)> 0'到你的子查询中... – JNK 2010-11-05 17:55:17