
Welcome to The World of Obscure Uses of Code and SQL – First Stop – Solving the Synoptic Gospel Issue with Transact-SQL
Jun 3, 2024
2 min read
2
159
1

Today we are looking to solve the problem of the synoptic gospels with SQL.
Is this possible?
Will we get anywhere?
Probably not.
But anyway, away we go.
There is much debate surrounding the synoptic gospels. Did Mark rely on Matthew? Did Matthew rely on Mark? Where does Luke fit in? Is there another document – Q? German scholarship seems to think so.
Does it matter?
What about the apochrypha?
Anyway -
Here we go:
The first thing we are going to do is upload a biblical database to SQL Server.
We are looking to see if the record of rooster crowing is in all three of the synoptic gospels.
So we just declare the variable ‘cock’.
Two recursive CTEs are declared: selecting the books of Mark and Matthew respectively to ensure that we aren’t scanning the whole of the scriptures.
The function SOUNDEX() determines how a string sounds, this is utilised to have a look at when examining the results.
The DIFFERENCE() function determines the similarity of two strings given the inputs of string 1 and string 2.
It is based on the Levenstein distance which is a mathematical concept with many applications such as autocorrect etc.
This function is probably not as helpful in this situation as the scriptural verses are very long and the translator's placement of verse markers are rather arbitrary.
The code is here:
DECLARE
@term varchar(max)
select @term = 'cock'
; WITH MARK AS (
SELECT n, t.id, t.c, t.v, cast(t.t as nvarchar(max)) as t
FROM master.dbo.key_english as k inner join dbo.t_bbe as t
on t.b = k.b
and k.b IN (41))
,
MATTHEW AS (
SELECT n, t.id, t.c, t.v, cast(t.t as nvarchar(max)) as t
FROM master.dbo.key_english as k inner join dbo.t_bbe as t
on t.b = k.b
and k.b IN (40))
SELECT *
FROM (
SELECT *, DIFFERENCE(text_1, text_2) as diff, SOUNDEX(text_1) as sdx, soundex(text_2) as sdx2
FROM (
SELECT M1.t as text_1,
M2.t as text_2,
CONCAT(M1.n,' ', M1.c, ' ', M1.v) as Book_Chapter_Verse_1,
CONCAT(M2.n,' ', M2.c,' ',M2.v) as Book_Chapter_Verse_2,
ROW_NUMBER () OVER (PARTITION BY CONCAT(M1.n,' ', M1.c, ' ', M1.v) ORDER BY M1.t) as RN
FROM MARK as M1 INNER JOIN MATTHEW as