从一个表引用多个外键到另一个表中的相同值并读取该值

问题描述

我正在开发一个用于创建和管理背景音频的应用程序。它由场景表示。

每个场景都有一个简介,背景音乐和氛围。我必须将这些音频类型不同,因为在我的应用程序中,它们被区别对待并且可以有自己的设置。此外,在列出场景时,我想按标题显示当前场景中的每种音频类型。在我的当前概念中,我必须加入3个表并获得一个标题列表。

现在我一直在研究一个概念,但是我不确定这是否是实现此目标的最佳方法。也许您可以帮助我进行优化。

这就是数据库的样子:

CREATE TABLE scene (
    id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,title TEXT NOT NULL,intro INTEGER,music INTEGER,ambience INTEGER,FOREIGN KEY (intro) REFERENCES audioInScene(id) ON DELETE CASCADE,FOREIGN KEY (music) REFERENCES audioInScene(id) ON DELETE CASCADE,FOREIGN KEY (ambience) REFERENCES audioInScene(id) ON DELETE CASCADE);

CREATE TABLE audioOpts (
    id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,volume INTEGER NOT NULL,repeat INTEGER NOT NULL);

CREATE TABLE audioFile (
    id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,path TEXT UNIQUE NOT NULL);

CREATE TABLE audioWithOpts (
    id INTEGER PRIMARY KEY,file INTEGER NOT NULL,opts INTEGER NOT NULL,FOREIGN KEY (file) REFERENCES audioFile (id),FOREIGN KEY (opts) REFERENCES audioOpts (id) ON DELETE CASCADE);

CREATE TABLE audioInScene(
    id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,inScene INTEGER NOT NULL,audio INTEGER NOT NULL,tag TEXT NOT NULL,FOREIGN KEY (inScene) REFERENCES scene (id) ON DELETE CASCADE,FOREIGN KEY (audio) REFERENCES audioWithOpts (id) ON DELETE CASCADE
);

例如,这是一个join语句,我必须执行该语句才能获得介绍性标题,音乐标题和环境标题:

SELECT scene.title,audioFile.title
FROM scene
INNER JOIN audioInScene ON scene.intro=audioInScene.audio OR scene.music=audioInScene.audio OR scene.ambience=audioInScene.audio
INNER JOIN audioWithOpts ON audioInScene.audio=audioWithOpts.id
INNER JOIN audioFile ON audioWithOpts.file=audioFile.id

输出看起来像:

sceneTitle | introTitle
sceneTitle | musicTitle
sceneTitle | ambienceTitle

我如何创建我的概念来获得这样的输出

sceneTitle | introTitle | musicTitle | ambienceTitle

解决方法

您可以在SQL Server中利用STRING_AGG来实现。

select [sceneTitle],STRING_AGG(IntroTitle,' | ') WITHIN GROUP (ORDER BY IntroTitle) AS IntroTitle
from dbo.table1 group  by [sceneTitle];
,

一种选择是进行3次连接,您可以使用WITH删除重复项。

deleteHandler = (index) => {
    let copyArray = [...this.state.array];
    console.log('copyArray: ' + copyArray);
    copyArray.splice(index,1);
    console.log('copyArray: ' + copyArray);
    this.setState({ length: copyArray.length,string: copyArray.join(''),array: copyArray });
  }

其他选择是使用查询并添加PIVOT以根据标题将行转换为列。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...