sqlite 在Sql中,我可以使用什么类似于内部连接,但在ON中有不同的列?

cvxl0en2  于 2022-12-29  发布在  SQLite
关注(0)|答案(1)|浏览(148)

我需要使用类似于Inner Join的SQL代码,但要能够在ON中使用不同的列。也许我可以使用一些更有针对性和更具体的东西。你认为我需要什么?我如何修复?
我想做的,按顺序,是:
1.在NEXT表中观察下一场芝加哥曲棍球比赛(芝加哥-明尼苏达)。芝加哥在ClubHome中显示

    • 下一个**

| 俱乐部之家|俱乐部之路|锦标赛|
| - ------| - ------| - ------|
| 芝加哥|明尼苏达州|非霍奇金淋巴瘤|
| 纽约|洛杉矶|非霍奇金淋巴瘤|
| 达拉斯|拉斯维加斯黄金|非霍奇金淋巴瘤|
1.在Results表中,如果芝加哥位于ClubHome中,则为每个芝加哥(1, 1)提取ScoreHome。如果芝加哥位于ClubAway中,则为每个芝加哥(4,1)提取ScoreAway。接下来,我想计算芝加哥的总点数,并希望得到1, 4, 1, 1
1.当然,我希望为Next中ClubHome列中的其他团队获得相同的结果,例如,New YorkDallas以及示例中未包括的其他团队。对于Chicago,我希望恢复1, 4, 1, 1;对于New York,我希望恢复2, 3, 2;对于Dallas,我希望恢复0, 3, 1。以及我在示例中没有输入的列中的其他俱乐部

    • 结果**

| 俱乐部之家|俱乐部之路|锦标赛|圆形|得分之家|得分|
| - ------| - ------| - ------| - ------| - ------| - ------|
| 芝加哥|多伦多|非霍奇金淋巴瘤|八个|1个|第二章|
| 纽约|拉斯维加斯|非霍奇金淋巴瘤|八个|第二章|三个|
| 达拉斯|芝加哥|非霍奇金淋巴瘤|七|无|四个|
| 渥太华|纽约|非霍奇金淋巴瘤|七|三个|三个|
| 芝加哥|布法罗萨博|非霍奇金淋巴瘤|六个|1个|无|
| 拉斯维加斯|芝加哥|非霍奇金淋巴瘤|六个|四个|1个|
| 纽约|达拉斯|非霍奇金淋巴瘤|五个|第二章|三个|
| 达拉斯|布法罗萨博|非霍奇金淋巴瘤|五个|1个|第二章|
1.我认为(但我可能错了)我需要像内部连接这样的东西,因为Next表中ClubHome列的Chicago ...必须匹配Results表中的BOTHClubHome和ClubAway。也许我错了。我需要循环for x in my.fetchall()是必要的,因为我已经开始使用循环以这种方式编写项目了

    • 输出**

我想得到这些输出:

Chicago-Minnesota, (1, 4, 1, 1)
New York-Los Angeles,(2, 3, 2) 
Dallas-Vegas Gold, (0, 3, 1)
...and other clubs
my = cursor.execute('''SELECT Next.ClubHhome||"-"||Next.ClubAway,
                              Results.ScoreHome, Results.ScoreAway
                       FROM Next
                       INNER JOIN Results 
                       ON
                       Next.ClubHhome = Results.ClubHhome OR Results.ClubAway
                       ''') 

for x in my.fetchall():
    print(x)

P. S:我使用Sqlite

chhkpiq4

chhkpiq41#

现在还不清楚你到底想要什么,但我会回答你什么时候想要next.clubhome中每支球队的所有分数,每一个分数一行。
从下一个选择,然后根据结果加入。根据results.clubhome或results.clubaway加入。你几乎已经得到了它。Next.ClubHome = Results.ClubHome OR Results.ClubAway意味着(Next.ClubHome = Results.ClubHome) OR Results.ClubAway,所以只要Results.ClubAway为真,它就会为真。你想要的是Next.ClubHome = Results.ClubHome OR Next.ClubHome = Results.ClubAwayNext.ClubHome in (Results.ClubHome, Results.ClubAway)
如果你想在next中包括所有的团队,即使他们在结果中没有行,使用左连接。
然后使用case语句来决定使用哪一个得分列。检查next.clubhome是否与results.clubhome或clubaway匹配。

select
  n.clubhome,
  case
  when n.clubhome = r.clubhome then r.scorehome
  when n.clubhome = r.clubaway then r.scoreaway
  end as score
from next n
left join results r on n.clubhome in (r.clubhome, r.clubaway)

如果希望每个队占一行,请按next.clubhome分组,并使用group_concat将每个队的所有分数连接到一个列表中。

select
  n.clubhome,
  group_concat(
    case
    when n.clubhome = r.clubhome then r.scorehome
    when n.clubhome = r.clubaway then r.scoreaway
    end
  ) as score
from next n
left join results r on n.clubhome in (r.clubhome, r.clubaway)
group by n.clubhome

Demonstration .

相关问题