mysql之此要求的 SQL 查询
我有一个包含表 sample
、surveytype
和 status
的 sqlite 数据库。所有 3 个表的主键 ID 都设置为表的外键 '操作。请看下图中的场景
我的 operation
表因此有值
并采样为
和状态
调查类型为
必需
我需要实现的是
从操作表中获取status id的信息,并针对所有调查类型的特定建筑物显示它。
尝试过
我找到了一种通过程序循环获取所有样本 ID 和所有调查类型 ID 并获取个人状态 ID 的方法
for all sampleid in sample table
{
for all statustypeid in statustype table
{
select statusid from operation where sampleid = 2 and surveytypeid=1
}
}
是否有更好的选择通过sql单查询来生成包含所有值的表
注意:使用 sqlite,适用于 ios 应用程序
请您参考如下方法:
首先:为什么 Operation.StatusID 是文本类型的,当它填充了整数字段的值时? 关于 RegionID 可能会被问到同样的问题,但由于此处未列出区域表,我无法判断,在特定情况下您可能需要 Text。但是将 Operation.StatusID 作为 Text 是完全不合理的,并且会降低性能。
然而,有一个古老的技巧,称为旋转,但它只适用于固定数量的列,在您的情况下 - 调查:
SELECT
Sample.BuildingID,
MAX(Sample.BuildingName_EN) BuildingID,
MAX(CASE WHEN Operation.SurveyTypeID=1 THEN Operation.StatusID ELSE " " END) AS Survey1,
MAX(CASE WHEN Operation.SurveyTypeID=2 THEN Operation.StatusID ELSE " " END) AS Survey2,
MAX(CASE WHEN Operation.SurveyTypeID=3 THEN Operation.StatusID ELSE " " END) AS Survey3
FROM Sample,Operation
WHERE Operation.SampleID=Sample.ID
GROUP BY Sample.BuildingID
更新: 为确保此解决方案的可扩展性,您必须每次在与另一个解决方案一起使用之前生成此查询:
SELECT ' SELECT Sample.BuildingID,MAX(Sample.BuildingName_EN) BuildingID,'
UNION ALL
SELECT concat(' MAX(CASE WHEN Operation.SurveyTypeID=',SurveyType.ID,' THEN Operation.StatusID ELSE " " END) AS "',SurveyType.LongName,'",') from SurveyType
UNION ALL
SELECT '0 as dummy FROM Sample,Operation WHERE Operation.SampleID=Sample.ID GROUP BY Sample.BuildingID'
或者,对于 Oracle 和 SQLite:
SELECT ' SELECT Sample.BuildingID,MAX(Sample.BuildingName_EN) BuildingID,'
UNION ALL
SELECT ' MAX(CASE WHEN Operation.SurveyTypeID='||SurveyType.I||' THEN Operation.StatusID ELSE " " END) AS "'||SurveyType.LongName||'",' from SurveyType
UNION ALL
SELECT '0 as dummy FROM Sample,Operation WHERE Operation.SampleID=Sample.ID GROUP BY Sample.BuildingID'
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。