2013-05-30 6 views
1

Мы пытаемся изменить процесс в нашей системе, и я не могу найти запрос, который будет извлекать правильные данные. Система в настоящее время извлекает данные из таблицы терминов с использованием titlekey из справочной информации автора, то есть все авторы имеют одинаковые термины. Мы хотим иметь возможность добавлять определенные термины для автора, разрезать все еще, чтобы другие авторы использовали термины, связанные с заголовком. Я не уверен, что SQL будет получать правильную строку слов на основе строки автора.Visual FoxPro Query

Моя мысль заключалась в том, чтобы добавить столбец автора в таблицу терминов. Для строки 2 в справочной информации автора мы хотели бы, чтобы строка 2 извлекалась из таблицы терминов. Но для строк 1 и 3 в таблице авторов мы хотели бы, чтобы строка 1 извлекалась из таблицы терминов. Это будет параметризованное представление. Возможно ли, чтобы один запрос выполнял поиск? Если это так, вы можете предоставить образец «FoxPro SQL»?

Пример:

Таблица автора:


Key AuthorKey TitleKey 
    --- --------- -------- 
    1   1   1 
    2   2   1 
    3   3   1 

Таблица терминов:


Key AuthorKey TitleKey Term 
    --- --------- -------- ---- 
    1   0   1  .50 
    2   2   0  .60 

Учитывая Автор ключ 2 и титульный ключ 1, строка 2 в Авторе таблице, мы хотели бы, чтобы термин .60 возвращался из таблицы терминов.

Приносим извинения, если я не был чист, поэтому вот пример, используя макетные таблицы выше.

Если я установил параметр вида titlekey равным 1 и authorkey viewparamter равным 2, я хотел бы получить .60, term key of 2, который будет извлечен.

Если я установил параметр вида titlekey равным 1 и authorkey viewparamter в 3, я хотел бы получить .50, term key of 1, который будет извлечен.

+0

Это поможет, если вы покажете пример того, какой тип вывода вы ожидаете ... – Sparky

+1

Не могли бы вы изменить название вопроса, чтобы быть более наглядным, так как тело вопроса не упоминает FoxPro один раз! Кроме того, можете ли вы представить пример желаемого результата, учитывая содержимое таблицы, которое вы уже предоставили? –

ответ

0

Это может быть неверно «FoxPro SQL», но я считаю, что он отвечает на ваш вопрос.

SELECT 
    Term.Term 
FROM Term 
    INNER JOIN Author ON Author.Key = Term.Key 
     AND Author.AuthorKey = @AuthorKey 
     AND Author.TitleKey = @TitleKey 

Установка @AuthorKey = 2 и @TitleKey = 1 будет производить .60, как в вашем примере.

Предполагается, что Author.Key и Term.Key являются уникальными столбцами в соответствующих таблицах и что комбинация Author.AuthorKey, Author.TitleKey также является уникальным ключом таблицы Author.

1

Ваш вопрос очень неясен, и я ДУМАЮ, что у меня есть то, что вы ищете. Позвольте мне попытаться повторить сообщение ... исправьте меня, если я ошибаюсь.

У вас есть список авторов ... У них есть ключ «Заголовок», который все авторы получают с учетом ставки процента независимо от конкретного соединения ... Однако при определенных условиях у нас есть термин, должен заменить термин «термин» по умолчанию, но только если есть соответствующая запись термина, в которой идентификатор ключа автора имеет совпадение. Если есть авторский ключ, вам нужен показатель THAT вместо значения по умолчанию.

Сказанное, я начинаю запрос с таблицы авторов. Я делаю TWO-соединения в таблице TERMS, используя разные псевдонимы, и присоединяюсь к соответствующим ключам Author и Title. NVL() у меня будет выглядеть FIRST для псевдонима «By Author» и получить его значение термина.Если значение «By Author» не указано, оно получает значение fall-back с помощью экземпляра псевдонима «By Title», который применим ко всем авторам, как вы изначально указывали.

Я захватил дополнительные столбцы, чтобы вы могли видеть корреляцию данных и подтвердить, что это так, как вы ожидаете.

select; 
     a.Key,; 
     a.AuthorKey,; 
     a.TitleKey,; 
     ByAuthor.Term as TermByAuthor,; 
     ByTitle.Term as TermByTitle,; 
     NVL(ByAuthor.Term, ByTitle.Term) as ChosenTerm; 
    FROM ; 
     author a ; 
     LEFT JOIN terms as ByAuthor ; 
      ON a.authorKey = ByAuthor.AuthorKey; 
     LEFT JOIN terms as ByTitle ; 
      ON a.TitleKey = ByTitle.TitleKey 

Если вы ищете конкретный автор, просто поставить

ГДЕ a.AuthorKey = whateverValue

+0

Я считаю, что это будет трюк. Спасибо –

+0

@KenDenault, если, как я описал, он должен, я создал курсоры и протестировал запрос :) – DRapp

+0

@KenDenault, если это действительно сработало, обязательно запустите и нажмите галочку, чтобы другие пользователи здесь пытались предложить помощь. Посмотрите на вопросы, которые все еще ждут решения ... это также помогает другим, у кого есть схожие по поводу того, что DID работает для вас, чтобы они могли попробовать их реализовать. – DRapp

0

Вашей база данных кажется неправильно нормализуется. Двойные ключи не помогают.

Предполагая, что ваши данные относятся к какой-либо платежной ведомости для системы публикации (т. Е. Каждый АВТОР имеет TITLE и оплачивается в заданном TERM), ваша структура таблицы будет проще и проще, чем указано ниже. (Обратите внимание, что вы должны изменить это для того, чтобы реально работать в FoxPro.)

CREATE TABLE author ( 
    authorID I AUTOINC PRIMARY KEY, 
    titleID I, 
    termID I 
) 

CREATE TABLE title (
    titleID I AUTOINC PRIMARY KEY, 
    termID I 
) 

CREATE TABLE term (
    termID I AUTOINC PRIMARY KEY, 
    rate N(3,2) 
) 

Затем можно выбрать авторов, их названия, а также их эффективные ставки, используя следующий запрос, используя subquery к выберите эффективный termID для каждого автора.

SELECT sq.authorID, sq.titleID, R.rate 
FROM (
    SELECT A.authorID, T.titleID, NVL(A.termID, T.termID) AS termID 
    FROM author AS A 
    INNER JOIN title as T ON A.titleID = T.titleID 
) as sq 
LEFT OUTER JOIN term as R 
    on sq.termID = R.termID 

Вы также можете вместо этого определить term, как только прямое численное значение, если отсутствуют другие столбцы, не отмеченные здесь. Если термин - это просто «сколько пенни за слово, которое уплачивает автор», он может идти прямо на TITLE или AUTHOR как прямой N(3,2) или даже Y.

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