使用Microsoft SQL Server 2012
我已经尝试了好几个星期来对我的原始问题进行排序,以便让查询正常工作,但确实如此。我想要从中获得的是在旧的问题表中我从数据路径获取数据"文件路径"问题数据从本地计算机上的文件夹引用的列,其结构如下所示:(某些列我没有包括在内)
旧问题表
QuizQuestionID MasterQuestionID MasterQuestionGUID MasterTypeID MasterDifficultyID MasterCategoryID MasterDecadeID QuizQuestionTypeID QuizQuestionDifficultyID QuizQuestionCategoryID QuizQuestionDecadeI D QuestionText AnswerText FilePath IsEditable IsDeletable IsDeleted IsDifficultyOverridden CreatedDate ModifiedDate AUTO_UseCount AUTO_TieBreakerUsageCount AUTO_TieBreakerLastUsed
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1222 1755 0bee472592ce78e7457d87d7a172ff7b 3 2 7 3 3 2 7 3 Name the singer. David Essex /Sounds/CHORUS David Essex - Tahiti.mp3 False True False False 2014-01-18 12:53:59.000 2014-02-07 12:28:55.000 0 NULL NULL
1223 1756 1df7bd191ef5e31b854c7de5f18982d0 1 2 11 NULL 1 2 11 NULL What is this savoury item? Green Chili /Images/General/Greeen Chili.png False True False False 2014-01-18 15:17:39.000 2014-01-26 19:46:00.000 0 NULL NULL
现在在新的问题表中,一列使用另一个名为media2的表来查找这些文件的本地文件路径:
新问题表
id uuid type question answer media created_date modified_date created_user modified_user master_category master_decade master_difficulty is_editable is_deletable multiple_choice choice_1 choice_2 choice_3 choice_4 blur_effect related square_1 square_2 square_3 square_4 tie_breaker
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
8033 07B3D24A-6FFA-40AF-B723-B78C9899D4B4 Audio Name the singer. David Essex 21488 2015-03-23 11:51:31.000 2016-03-08 15:21:48.697 NULL NULL 7 2 1 False False False NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
17395 48E555BD-52D6-4358-89E5-8FEE0F0F3AFD Text What is this savoury item? Green chili 19459 2013-09-10 23:51:35.460 2013-09-13 12:51:53.963 NULL NULL 12 NULL 1 False False NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
Media2表
id UUID name Path Mime/type directory used for Category folder import folder
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
21488 c25183d2-aad7-4c16-8869-9eac711cc39b CHORUS David Essex - Tahiti Quiz C:\media\audio\c25183d2-aad7-4c16-8869-9eac711cc39b.mp3 audio/mp3 Audio Quiz Audio NULL NULL
19459 642db3c3-c531-4818-9b0d-4d7ccd35e0f9 Green chili C:\media\images\642db3c3-c531-4818-9b0d-4d7ccd35e0f9.png image/png Images Quiz Images NULL NULL
只需添加" UUID"其他表是一组随机数字,用于识别文件夹中的文件名,因此我们不会获得任何可能被命名为相同但不具有相同内容但也被其他人使用的重复文件除了测验之外的软件,所以我不能将其用作创建查询的参考。
这是转换"旧问题表"的整个代码。进入"新问题表"子字符串是将格式从旧格式转换为新格式的部分,它可以正常工作,但澄清它会向" media"任何图像或声音问题上的列,它应该将旧表中的文件路径列转换为" media2"表,然后使用" media"将所有行导入新问题表。列引用" media2"文件路径表。
--Specify the database, table and columns we want to insert into
INSERT INTO NewDatabase.dbo.quizquestions (uuid, [type], question, answer, created_date, modified_date, master_category, master_decade, master_difficulty, is_editable, is_deletable, media)
--Get the data from the old database (old_database) and map the media filename to the media2 table in the new database
select
questions.uuid,
questions.newtype,
questions.QuestionText,
questions.AnswerText,
questions.CreatedDate,
questions.ModifiedDate,
questions.master_category,
questions.master_decade,
questions.master_difficulty,
questions.IsEditable,
questions.IsDeletable,
media.id as mediaid from
(
select NEWID() as uuid,
CASE
WHEN qqt.TypeName = 'Sound' THEN 'Audio'
ELSE qqt.TypeName
END AS newtype,
qq.QuestionText, qq.AnswerText,
CASE
WHEN qq.createdDate is not NULL THEN qq.createdDate
ELSE GETDATE()
END as createdDate,
CASE
WHEN qq.ModifiedDate is not NULL THEN qq.ModifiedDate
ELSE GETDATE()
END as ModifiedDate,
CASE
WHEN cat.id is NOT NULL THEN cat.id
ELSE 1
END as master_category,
qqdc.QuizQuestionDecadeID as master_decade,
qd.id as master_difficulty,
qq.IsEditable, qq.IsDeletable,
qq.FilePath,
SUBSTRING(
qq.FilePath,
(len(qq.FilePath) - charindex('/', reverse(qq.FilePath)) + 2),
(len(qq.FilePath) - charindex('.', reverse(qq.FilePath))) - (len(qq.FilePath) - charindex('/', reverse(qq.FilePath))) -1 ) as fpath
-- (len(qq.FilePath) - charindex('.', reverse(qq.FilePath)) as positionoflastdot),
--(len(qq.FilePath) - charindex('/', reverse(qq.FilePath)) as positionoflastslash),
from Olddatabase.dbo.QuizQuestion qq
left join Olddatabase.dbo.QuizQuestionType qqt on qq.QuizQuestionTypeID = qqt.QuizQuestionTypeID
left join Olddatabase.dbo.QuizQuestionDifficulty qqd on qq.QuizQuestionDifficultyID = qqd.QuizQuestionDifficultyID
left join Olddatabase.dbo.QuizQuestionCategory qqc on qq.QuizQuestionCategoryID = qqc.QuizQuestionCategoryID
left join Olddatabase.dbo.QuizQuestionDecade qqdc on qq.QuizQuestionDecadeID = qqdc.QuizQuestionDecadeID
left join Olddatabase.dbo.QuizQuestionCategory qqmc on qq.MasterCategoryID = qqmc.MasterQuestionCategoryID
left join Newdatabase.dbo.QuizCategories cat on qqc.CategoryName = cat.name
left join Newdatabase.dbo.QuizDifficulties qd on qd.id = qq.MasterDifficultyID
where qq.MasterCategoryID is not null
) as questions
left join Newdatabase.dbo.Media2 media on media.name = replace(fpath, 'quiz','')
由于软件非常依赖它,因此无法真正改变表的结构,并且手动更改它会非常痛苦和耗时,因为有超过2000个音频/图像问题
我只是围绕SQL数据库和查询,但这已经让我无法继续前进。
任何改变上述查询或创建完全不同的内容的帮助都将非常感激。
答案 0 :(得分:0)
只要看一下,代码看起来结构合理。面对这样的事情,我将查询“减少”到只有相关的部分,并从那里进行调试,抛出额外的行,就像你现在已注释掉的那些,以查看返回的函数调用的部分。选择它的一部分,看看所有的细节,你最终会弄清楚什么没有排队。以下内容应作为初始"最小查询":
select
qquestions.FilePath
,questions.fpath
,media.id as mediaid
from (-- Build the necessary filepath. Running just the subquery can help figure things out too
select
qq.FilePath
,SUBSTRING(
qq.FilePath
,(len(qq.FilePath) - charindex('/', reverse(qq.FilePath)) + 2)
,(len(qq.FilePath) - charindex('.', reverse(qq.FilePath))) - (len(qq.FilePath) - charindex('/', reverse(qq.FilePath))) -1 ) as fpath
from Olddatabase.dbo.QuizQuestion qq
where qq.MasterCategoryID is not null
) as questions
left join Newdatabase.dbo.Media2 media
on media.name = replace(fpath, 'quiz','')
与此相关,应该更容易搞清楚事情。
奖金建议:代码如
CASE
WHEN qq.createdDate is not NULL THEN qq.createdDate
ELSE GETDATE()
END as createdDate,
可以用更短更易读的形式替换
isnull(qq.createdDate, getdate()) createdDate,