SELECT fact
FROM Facts
WHERE name = ?
and Type = 1
UNION
SELECT BaseFacts.fact
FROM Facts as BaseFacts
JOIN Facts as AliasFacts ON BaseFacts.fact_id = Convert(int,AliasFacts.data)
WHERE AliasFacts.name = ?
and AliasFacts.Type = 2
and BaseFacts.Type = 1
-- and this all works only if you do not ever have an alias to an alias!
####
SELECT fact
FROM Facts
WHERE name = ?
UNION
SELECT fact
FROM Facts
JOIN Aliases ON Aliases.fact_id = Facts.fact_id
WHERE Aliases.name = ?
####
SELECT fact
FROM Facts
JOIN Names ON Names.Fact_id = Facts.fact_id
WHERE Names.Name = ?