你有一个像外键一样的外表名吗?

时间:2015-07-17 22:14:03

标签: sql

我正在玩一些想法。基本上我想要一个外键但我想要使用该键的表也应该在行中。这样外键可以引用不同的表。通常,您只需从任何需要取消引用此指针的查询中返回一个结果。

我知道我可以只存储表名并使用两个select语句来执行此操作,插入第一个select的结果以获取表并键入下一个调用索引右表,但是可以使用在数据库上单一选择? sql会是什么样的?

编辑:让我看看我是否可以提出一个例子。 MediaTable ID |名称|业主|输入|的Fkey

MP3 ID |艺术家|专辑|标题| BitRate |编解码器|数据

电影 ID |标题|分辨率| imdbUrl | AudioCodec | VideoCodec |数据

OK设计但是... leta说我想在MediaTable中搜索所有标题(在Mp3或电影表中),其中MediaTable.Owner =" ekl"假设FKey是ID字段的外键。 Can" MediaTable.type"选择FKey应该应用于哪个表?

是的,我知道这不是做这个特定例子的最好方法,但它比解释两个我想要的大项目更容易。

2 个答案:

答案 0 :(得分:0)

基本上,您要做的是参数化外键并添加要引用的表。

理论上,它可以通过字符串连接查询并一次执行来完成。但是,获取组件字符串可能需要多次调用或过程调用。

尽管理论上可行,但我想提醒一下,您尝试做的事情是非常不同寻常的,导致代码变慢(由于字符串连接)和不可维护。< / p>

答案 1 :(得分:0)

外键不仅仅是在插入时验证数据的完整性。您得到SELECT后得到的任何列都是因为您在执行SELECT时明确要求它,而不是因为数据库自动跟随外键引用。如果你有充分的理由,你可以在不使用任何FK约束的情况下设计整个模式,并且它可以正常工作。

因此,如果要一次搜索多个表,则需要从这些表中明确选择。在您的示例中,可以使用UNION

完成此操作
SELECT mt.fkey, mt.owner, mt.type, media.title
  FROM mediatable mt INNER JOIN 
       (SELECT id, 'MP3' AS type, title FROM mp3
        UNION
        SELECT id, 'MOVIE', title FROM movie) media
       ON mt.fkey = media.id AND mt.type = media.type
 WHERE mt.owner = 'ekl';