【问题标题】:nested select query with table name in sqlitesqlite中带有表名的嵌套选择查询
【发布时间】:2021-05-02 10:13:36
【问题描述】:

我正在尝试从以特定名称开头的所有表中选择所有不同的值,例如:'logs_2020_12_01'、'logs_2021_01_02'、..选择具有此特定名称的所有表很简单:
SELECT name FROM sqlite_master WHERE type='table' AND name LIKE 'logs_%';

我想要为一个单独的表选择是:

SELECT DISTINCT batch FROM logs_2021_01_27;

但我找不到将其组合起来以从所有表中进行选择的方法。我尝试了几件事,但它不起作用,例如:

SELECT DISTINCT batch FROM (SELECT name FROM sqlite_master WHERE type='table' AND name LIKE 'logs_%')

有什么想法吗?
谢谢

【问题讨论】:

  • 我对“所有表格”感到困惑。您的第一个示例仅从单个表中进行选择。您可能会在您的表之间进行 UNION。我不知道您希望如何从只选择名为“名称”的列的结果集中选择“批处理”。你的表结构是什么样的?
  • 我有 2 个名为“logs_2020_12_01”和“logs_2021_01_02”的表;每个表都有一个列名批次。我想要做的是从所有表中选择所有不同的批次。我需要的结果/输出是每个表的不同批次数

标签: sql sqlite select nested


【解决方案1】:

如何使用动态 SQL,将您的表信息存储到具有 id 列的临时表中并将其设置为标识。

CREATE TABLE #temp ---identity column will be used to iterate
(
id INT IDENTITY,
TableName VARCHAR(20)
)

INSERT INTO #temp
SELECT name FROM sqlite_master WHERE type='table' AND name LIKE 'logs_%';

-- choose your own results with where conditions

DECLARE @SQL VARCHAR(MAX)
DECLARE @Count INT = 1
DECLARE @Table VARCHAR(20)

WHILE @COUNT <= (SELECT COUNT(*) FROM #temp) 
BEGIN

    select @table = TABLENAME FROM #temp WHERE id = @Count
    
    SELECT @sql = 'SELECT DISTINCT(batch) FROM '+ @table

    PRINT @SQL
SET @Count = @Count + 1

END

等你的打印结果看起来不错后,把它改成EXEC(@SQL),谢谢

【讨论】:

  • SQLite 不支持动态 sql。
  • 对不起,没意识到是SQLite问题
【解决方案2】:

SQLite 不支持动态 sql。
您必须从所有表中选择列 batch 并将它们与 UNION 组合,以便删除重复项:

SELECT batch FROM logs_2020_12_01 UNION
SELECT batch FROM logs_2020_12_02 UNION
......................................
SELECT batch FROM logs_2020_12_30 UNION
SELECT batch FROM logs_2020_12_31 

如果您不知道表的全名,可以使用以下语句获取它们:

SELECT name
FROM sqlite_master
WHERE type = 'table' AND name LIKE 'logs/_%' ESCAPE '/' 

然后用编程语言构造一个SELECTUNION的语句,得到你想要的结果。

【讨论】:

  • 是的,但我不知道表的名称,我只知道名称以'logs_'开头,这就是为什么我首先尝试提取所有表名:SELECT name FROM sqlite_master WHERE type='table' AND name LIKE 'logs_%';
  • @Lucian 你不能用 SQLite 做到这一点。您可以使用编程语言单独访问这些表。
猜你喜欢
  • 1970-01-01
  • 2017-02-13
  • 2015-08-16
  • 2011-08-14
  • 1970-01-01
  • 1970-01-01
  • 2012-05-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多