2010-11-05 4 views
0

здесь есть один запрос, который возвращает только один столбец с именем DATAPATH: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 

еще слова в этом операторе отбора ниже, вместо выбора канала данных, я хотел бы запустить выше оператор 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

Что связь между вашим DATAPATH запроса и полей в batchinfo? ** Вам нужно указать, какие строки совпадают. ** – JNK

+0

@jnk очень хорошая точка, логика заключается в том, что вместо выбора datapath я хочу выбрать подмножество datapath, подмножество датапата является первым выбором statemenet –

+0

@ Я девушка. Я имею в виду, как вы знаете, какой datapath (из подмножества) соответствует той строке в batchinfo? – JNK

ответ

0

Если я правильно читать это, я думаю, вы должны быть в состоянии присвоить свой столбец «DATAPATH» во втором выберите к значению вы выбираете в первом, и репутация lace '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 для «number not found» и «number at end of line» ». – gbn

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 Почему ты так хорош для меня? –

+0

@gbn btw Я не думаю, что ваш patindex работает, так как он дал мне ошибки, так как некоторые ячейки length = 0 –

+0

@i am a girl = Добавить 'WHERE LEN (datapath)> 0' в ваш подзапрос ... – JNK

Смежные вопросы