Запрос из нескольких таблиц текстовой базы ODBC
База состоит из *.csv-файлов. При выборке из одной таблицы все проходит нормально, данные получаю:
Код:
SELECT COUNT(VarName) FROM Dav5.csv WHERE VarName='aiPT8'
Не могу выполнить запрос из 2-х таблиц:
Код:
SELECT COUNT(VarName) FROM Dav5.csv, Dav6.csv WHERE VarName='aiPT8'
Здесь SQLExecDirect возвращает -1. Таблицы по структуре одинаковы. В примерах с другими базами видел, что в случаях с несколькими таблицами обращение к имени колонки идет через точку с именем таблицы, т.е. вроде бы я должен писать ...WHERE Dav5.csv.VarName='aiPT8' Но что-то много точек получается:), не проходит. И без .csv нельзя...
[highlight=sql]
select
(convert(integer, (select count(*) from Dav5.csv where VarName='aiPT8')) +
convert(integer, (select count(*) from Dav6.csv where VarName='aiPT8')))
[/highlight]
?
Вроде все правильно ввел, но не проходит, все равно -1 ... :confused:
в MS SQL Server 2000 работает...
Код:
SELECT COUNT(D5.VarName) FROM Dav5.csv D5, Dav6.csv D6 WHERE D5.VarName='aiPT8'
ыы? Ты же вроде считаешь записи только из таблицы D5?
Код:
SQLTCHAR temprq[300]=L"SELECT COUNT(D5.VarName) FROM Dav5.csv D5, Dav6.csv D6 WHERE D5.VarName='aiPT8'";
retcode=SQLExecDirect(hstmt, (SQLTCHAR*)temprq, SQL_NTS);
retcode = SQLFetch(hstmt);
SQLINTEGER i, v;
retcode=SQLGetData(hstmt, 1, SQL_C_DEFAULT, &i, sizeof(i), &v);
retcode=SQLExecDirect(hstmt, (SQLTCHAR*)temprq, SQL_NTS);
retcode = SQLFetch(hstmt);
SQLINTEGER i, v;
retcode=SQLGetData(hstmt, 1, SQL_C_DEFAULT, &i, sizeof(i), &v);
D5 и D6 - псевдонимы таблиц. если вместо них подставишь названия табиц, ничего не изменится. нужны для удобочитаемости (насколько я знаю, больше никакой смысловой нагрузки они не несут)
Если я правильно понял, то при правильной записи следующего запроса (от автора):
[highlight=sql]
SELECT COUNT(VarName) FROM Dav5.csv, Dav6.csv WHERE VarName='aiPT8'
[/highlight]
должно выдаваться кол-во строк в Dav5.csv с VarName = 'aiPT8', помноженное на количество всех строк в Dav6.csv. Наверняка, автор хотел другого, а именно — того, что получается в ответ на запрос из второго поста (от Washington).
Если в Dav5 и в Dav6 находятся две части одного множества, в котором нужно посчитать число строк с VarName = 'aiPT8', попробуй один из трех следующих запросов (по примеру Washington).
[highlight=sql]
select
((select count(*) from Dav5.csv where VarName='aiPT8') +
(select count(*) from Dav6.csv where VarName='aiPT8'))
[/highlight]
или
[highlight=sql]
select
(coalesce((select count(*) from Dav5.csv where VarName='aiPT8'), 0) +
coalesce((select count(*) from Dav6.csv where VarName='aiPT8'), 0))
[/highlight]
или
[highlight=sql]
select
count(*) from Dav5.csv D5 full outer join Dav6.csv D6
where
D5.VarName=D6.VarName and (D5.VarName='aiPT8' or D6.VarName='aiPT8')
[/highlight]
Пробовать желательно от верха к низу. Если я напортачил, поправьте, кто-нибудь. =)
дык я и говорю, мой запрос в MS SQL Server 2000 возвращает ожидаемое значение.
Цитата:
Если в Dav5 и в Dav6 находятся две части одного множества, в котором нужно посчитать число строк с VarName = 'aiPT8'...
Именно так, нужна сумма строк из таблиц, я и подумать не мог, что у меня результаты перемножались (с SQL имею дело впервые). Буду пробовать предложенные варианты, спасибо.
А можно средствами ODBC или с помощью SQL-запроса получить информацию о таблицах в базе? Т. е. нужно узнать цифру в имени последнего файла (Dav6.csv, например), чтобы опросить все таблицы в одном запросе, начиная с Dav0, и получить сумму строк. Причем в базе присутствуют таблицы и с другими именами: Temp0.csv, Temp1.csv и т. д.