1

我们正在尝试修改系统中的流程,但我无法提出可以检索正确数据的查询。系统当前使用来自作者信息表的术语表检索数据titlekey,这意味着所有作者都有相同的术语。我们希望能够为作者添加特定术语,但仍允许其他作者使用与标题关联的术语。我不确定什么SQL会根据作者行检索正确的术语行。

我的想法是在术语表中添加一个作者列。对于作者信息表中的第 2 行,我们希望从术语表中检索第 2 行。但是对于 author 表中的第 1 行和第 3 行,我们希望从 term 表中检索第 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 行,我们希望从术语表中返回 0.60 术语。

如果我不清楚,我很抱歉,所以这里是一个使用上面模拟表的例子。

如果我将 titlekey 视图参数设置为 1,将 authorkey viewparamter 设置为 2,我希望检索 0.60,即 2 的术语键。

如果我将 titlekey 视图参数设置为 1,将 authorkey viewparamter 设置为 3,我希望检索 0.50,即 1 的术语键。

4

3 回答 3

1

你的问题很不清楚,我想我有你要找的东西。让我尝试重述帖子...如果我不正确,请纠正我。

你有一个作者列表......至少,他们有一个“标题”键,所有作者都可以获得一个任期费率,而不管具体的加入......但是,在某些条件下,我们有一个应该取代默认值的术语“词条”,但前提是存在作者的 Key ID 匹配的对应词条记录。如果存在基于作者的密钥,则您需要该实例的速率而不是默认值。

也就是说,我正在使用作者表开始查询。我正在使用不同的别名对 TERMS 表进行两次连接,并加入各自的 Author 和 Title 键。我拥有的 NVL() 将首先查找“作者”别名并获取它的术语值。如果没有“按作者”值,它将通过“按标题”别名实例获取后备值,该值适用于您最初指定的所有作者。

我已经抓取了额外的列,因此您可以查看数据的相关性并确认它与您预期的一样。

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

如果您正在寻找特定作者,只需输入

WHERE a.AuthorKey = 不管值

于 2013-05-31T22:10:35.733 回答
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表的唯一键。

于 2013-05-30T16:21:42.993 回答
0

您的数据库似乎未正确规范化。重复的键没有帮助。

假设您的数据用于发布系统的某种工资单(即,每个作者都有一个 TITLE,并按固定期限支付),您的表结构将更容易和更简单,如下所示。(请注意,您必须对其进行编辑才能在 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)
)

然后,您可以使用如下查询选择作者、他们的标题和有效率,使用子查询为每个作者选择有效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.

于 2013-06-08T02:42:45.193 回答