Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Запрос из нескольких таблиц текстовой базы ODBC

14K
09 апреля 2009 года
artem_kvadro
63 / / 30.07.2007
Добрый день!
База состоит из *.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 нельзя...
6
09 апреля 2009 года
George
4.1K / / 05.01.2007
а так:
[highlight=sql]
select
(convert(integer, (select count(*) from Dav5.csv where VarName='aiPT8')) +
convert(integer, (select count(*) from Dav6.csv where VarName='aiPT8')))
[/highlight]
?
14K
09 апреля 2009 года
artem_kvadro
63 / / 30.07.2007
Вроде все правильно ввел, но не проходит, все равно -1 ... :confused:
6
09 апреля 2009 года
George
4.1K / / 05.01.2007
в MS SQL Server 2000 работает...
8.2K
10 апреля 2009 года
Ora-cool
211 / / 20.09.2007
А если так:

 
Код:
SELECT COUNT(D5.VarName) FROM Dav5.csv D5, Dav6.csv D6 WHERE D5.VarName='aiPT8'
6
10 апреля 2009 года
George
4.1K / / 05.01.2007
ыы? Ты же вроде считаешь записи только из таблицы D5?
14K
10 апреля 2009 года
artem_kvadro
63 / / 30.07.2007
...попробовал, запрос выполнился, но очень долго, около минуты. И результат получился недостоверный (огромное число, а реально 2 файлика по 2 Мб). А в чем суть D5 и D6, откуда они берутся?
 
Код:
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);
6
10 апреля 2009 года
George
4.1K / / 05.01.2007
D5 и D6 - псевдонимы таблиц. если вместо них подставишь названия табиц, ничего не изменится. нужны для удобочитаемости (насколько я знаю, больше никакой смысловой нагрузки они не несут)
287
10 апреля 2009 года
Shiizoo
958 / / 14.03.2004
С сабжем не знаком, но выглядит всё как гадание на кофейной гуще, что же хотел автор топика.

Если я правильно понял, то при правильной записи следующего запроса (от автора):
[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]

Пробовать желательно от верха к низу. Если я напортачил, поправьте, кто-нибудь. =)
6
11 апреля 2009 года
George
4.1K / / 05.01.2007
дык я и говорю, мой запрос в MS SQL Server 2000 возвращает ожидаемое значение.
14K
13 апреля 2009 года
artem_kvadro
63 / / 30.07.2007
Цитата:
Если в Dav5 и в Dav6 находятся две части одного множества, в котором нужно посчитать число строк с VarName = 'aiPT8'...


Именно так, нужна сумма строк из таблиц, я и подумать не мог, что у меня результаты перемножались (с SQL имею дело впервые). Буду пробовать предложенные варианты, спасибо.
А можно средствами ODBC или с помощью SQL-запроса получить информацию о таблицах в базе? Т. е. нужно узнать цифру в имени последнего файла (Dav6.csv, например), чтобы опросить все таблицы в одном запросе, начиная с Dav0, и получить сумму строк. Причем в базе присутствуют таблицы и с другими именами: Temp0.csv, Temp1.csv и т. д.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог