如何在 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 中将两列合二为一,同时获取外键的底层值?的主要内容,如果未能解决你的问题,请参考以下文章