如何在 Sqlite 中将两列合二为一,同时获取外键的底层值?

Posted

技术标签:

【中文标题】如何在 Sqlite 中将两列合二为一,同时获取外键的底层值?【英文标题】:How to combine two columns into one in Sqlite and also get the underlying value of the Foreign Key? 【发布时间】:2019-11-28 16:09:55 【问题描述】:

我希望能够将表中的两列合并为一列,然后才能获得外键的实际值。我可以单独做这些事情,但不能一起做。

按照下面的答案,我能够使用下面的第一个 sql 语句将两列合并为一个。

How to combine 2 columns into a new one in sqlite

组合过程如下图:

+---+---+ |高温 | AT| +---+---+ |1 | 2 | |5 | 7 | |9 | 5 | +---+---+

一栏如图所示:

+---+ |高温 | +---+ | 1 | | 5 | | 9 | | 2 | | 7 | | 5 | +---+

第二条SQL语句显示的是每个外键id对应的每个外键的实际值。外键表。

+-----+-------------+ |T_id |田纳西州 | +-----+-------------+ | 1 | '达拉斯牛仔队 | | 2 | '芝加哥熊' | | 5 | '新英格兰爱国者' | | 7 | '纽约巨人' | | 9 | '纽约喷气机' | +-----+-------------+
sql = "SELECT * FROM (SELECT M.HT FROM M UNION SELECT M.AT FROM Match)t" 

第二条 sql 语句让我获取 M.HT 中每个值的外键值。

sql = "SELECT M.HT, T.TN FROM M INNER JOIN T ON M.HT = T.Tid WHERE strftime('%Y-%m-%d', M.ST) BETWEEN \'2015-08-01\' AND \'2016-06-30\' AND M.Comp = 6 ORDER BY M.ST"    

第二条SQL语句的结果:

+-----+-------------+ |高温 |田纳西州 | +-----+-------------+ | 1 | '达拉斯牛仔队 | | 5 | '新英格兰爱国者' | | 9 | '纽约喷气机' | +-----+-------------+

但我可能无法组合这些查询!

【问题讨论】:

【参考方案1】:

我相信以下方法会起作用(假设表是 Match 和 T 并且为了简洁/方便而使用 WHERE 和 ORDER BY 子句):-

SELECT DISTINCT(m.ht), t.tn
FROM 
    (SELECT Match.HT FROM Match UNION SELECT Match.AT FROM Match) AS m
    JOIN T ON t.tid = m.ht 
    JOIN Match ON (m.ht = Match.ht OR m.ht = Match.at)
/* WHERE and ORDER BY clauses using Match as m only has columns ht and at */
WHERE strftime('%Y-%m-%d', Match.ST) 
    BETWEEN \'2015-08-01\' AND \'2016-06-30\' AND Match.Comp = 6 
ORDER BY Match.ST
;
注意仅在没有 WHERE 和 ORDER BY 子句的情况下进行测试。

这是使用 :-

DROP TABLE IF EXISTS Match;
DROP TABLE IF EXISTS T;
CREATE TABLE IF NOT EXISTS Match (ht INTEGER, at INTEGER, st TEXT DEFAULT (datetime('now')));
CREATE TABLE IF NOT EXISTS t (tid INTEGER PRIMARY KEY, tn TEXT);
INSERT INTO T (tn) VALUES('Cows'),('Bears'),('a'),('b'),('Pats'),('c'),('Giants'),('d'),('Jets');
INSERT INTO Match (ht,at) VALUES (1,2),(5,7),(9,5);
/* Directly without the Common Table Expression */
SELECT 
    DISTINCT(m.ht), t.tn, 
    Match.st /*<<<<< Added to show results of obtaining other values from Matches >>>>> */
FROM 
    (SELECT Match.HT FROM Match UNION SELECT Match.AT FROM Match) AS m
    JOIN T ON t.tid = m.ht 
    JOIN Match ON (m.ht = Match.ht OR m.ht = Match.at)
/* WHERE and ORDER BY clauses here using Match */
;
请注意,为简洁起见,使用了有限的数据(仅多出一列)

结果:-

【讨论】:

以上是关于如何在 Sqlite 中将两列合二为一,同时获取外键的底层值?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MySQL 中将多列处理为一列?

在 SQLite 中组合两列的巧妙方法?

UICollectionView 默认为一列,我如何获得两列?

oracle中如何选择两列比较为一列

SQLite-如何比较两列

如何像蜂巢中的地图一样将两列合并为一列?