【问题标题】:Reordering the results of an SQL query using SQLite使用 SQLite 重新排序 SQL 查询的结果
【发布时间】:2021-10-27 12:41:33
【问题描述】:

我有一个模拟梵文名词的 SQLite 数据库,并有如下表格:(对不起,如果它很长。我已尝试将内容缩减到最低限度以理解这个问题。)

数字:

id number
1 singular
2 dual
3 plural

案例:

id case
1 nominative
2 accusative
3 instrumental
4 dative
5 ablative
6 genitive
7 locative
8 vocative

名词:

id name
1 rAma

表格:

id form noun
1 rAmaH 1
2 rAmau 1
3 rAmAH 1
4 rAmam 1
5 rAmAN 1
6 rAmENa 1
7 rAmAbhyAm 1
8 rAmaiH 1
9 rAmAya 1
10 rAmebhyaH 1
11 rAmAt 1
12 rAmasya 1
13 ramayoH 1
14 rAmANAm 1
15 rAme 1
16 rAmeShu 1
17 rAma 1
  • 名词是引用名词(id)的外键

名词:

id form case number noun
1 1 1 1 1
2 2 1 2 1
3 3 1 3 1
4 4 2 1 1
5 2 2 2 1
6 5 2 3 1
7 6 3 1 1
8 7 3 2 1
9 8 3 3 1
10 9 4 1 1
11 7 4 2 1
12 10 4 3 1
13 11 5 1 1
14 7 5 2 1
15 10 5 3 1
16 12 6 1 1
17 13 6 2 1
18 14 6 3 1
19 15 7 1 1
20 13 7 2 1
21 16 7 3 1
22 17 8 1 1
23 2 8 2 1
24 3 8 3 1
  • form 是引用 forms(id) 的外键
  • case 是引用 case(id) 的外键
  • number 是引用 numbers(id) 的外键
  • 名词是引用名词(id)的外键

我可以用这个 SQL 查询得到名词 rAma 的所有变格:

SELECT forms.form FROM forms JOIN nouns,nounforms
    WHERE forms.id = nounforms.form
        AND nounforms.noun = nouns.id
        AND noun.name = "rAma"
    GROUP BY nounforms.case, nounforms.number;

并且在 24 行中完美地返回整个名词:

form
rAmaH
rAmau
rAmAH
rAmam
rAmau
rAmAN
rAmENa
rAmAbhyAm
rAmaiH
rAmAya
rAmAbhyAm
rAmebhyaH
rAmAt
rAmAbhyAm
rAmebhyaH
rAmasya
ramayoH
rAmANAm
rAme
ramayoH
rAmeShu
rAma
rAmau
rAmAH

到目前为止一切顺利。但我真正想要的是这样的:

singular dual plural
rAmaH rAmau rAmAH
rAmam rAmau rAmAN
rAmENa rAmAbhyAm rAmaiH
rAmAya rAmAbhyAm rAmebhyaH
rAmAt rAmAbhyAm rAmebhyaH
rAmasya ramayoH rAmANAm
rAme ramayoH rAmeShu
rAma rAmau rAmAH

即每个案例 8 行,每个数字 3 列。问题是我的 SQL 知识不足以让我到达那里。我想我想要的是一个视图或一个虚拟表。那正确吗?同样,一旦解决了这个问题,我想对查询进行参数化,这样我就可以将它用于 rAma 以外的名词,但我认为 SQLite 不支持存储过程。那正确吗?如果是这样,解决方法是什么?

顺便说一句,我知道我可以在我的应用程序中进行重新排序。其实我就是这样 现在正在做,但我希望尽可能多地集中在数据库中,以便可以移植到其他语言/环境。

谁能帮忙?

【问题讨论】:

    标签: sql sqlite join case sql-max


    【解决方案1】:

    你需要条件聚合:

    SELECT MAX(CASE WHEN nf.number = 1 THEN f.form END) singular,
           MAX(CASE WHEN nf.number = 2 THEN f.form END) dual,
           MAX(CASE WHEN nf.number = 3 THEN f.form END) plural
    FROM forms f 
    JOIN nouns n ON n.id = f.noun
    JOIN nounforms nf ON f.id = nf.form AND nf.noun = n.id
    WHERE n.name = ?
    GROUP BY nf.`case`;
    

    将占位符 ? 替换为您想要的名词。

    此外,请始终对表使用带有 ON 子句和别名的正确连接,以使代码更短且更具可读性。

    请参阅demo

    如您所知,SQLite 不支持存储过程或函数,因此使用此查询的最佳方法可能是在您的应用程序中使用占位符 ? 在准备好的语句中传递名词作为参数。

    【讨论】:

    • 谢谢这成功了。也感谢你提醒我 dbfiddle 的存在。这将非常有用。
    猜你喜欢
    • 1970-01-01
    • 2016-01-15
    • 1970-01-01
    • 1970-01-01
    • 2013-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-22
    相关资源
    最近更新 更多