Join 如何查询具有父子关系的表
情况: 我有一个名为“word”的表,其中包含一个带有相关翻译的单词Join 如何查询具有父子关系的表,join,sql-server-2008-r2,relation,Join,Sql Server 2008 R2,Relation,情况: 我有一个名为“word”的表,其中包含一个带有相关翻译的单词 | ID | name | lang_id | parent_id | |----|----------|---------|-----------| | 1 | screw | 1 | null | | 2 | schraube | 2 | 1 | | 3 | vis | 3 | 1 | 所以螺旋是没有父词的主词。其
| ID | name | lang_id | parent_id |
|----|----------|---------|-----------|
| 1 | screw | 1 | null |
| 2 | schraube | 2 | 1 |
| 3 | vis | 3 | 1 |
所以螺旋是没有父词的主词。其他数据集与具有父项id的父项关联
我想要什么:
select word.id, word.name, word.lang_id, word.parent_id
from word
left join word w2 on word.parent_id = w2.parent_id
WHERE w2.name = 'screw';
-- and word.lang_id = 2
我需要一个显示我搜索的单词和我输入的单词的查询
- 如果我从德语到法语查询“schraube”一词,我想得到数据集2和3
- 我想得到数据集1和3,如果我查询单词“螺丝钉”从英语到法语
select word.id, word.name, word.lang_id, word.parent_id
from word
left join word w2 on word.parent_id = w2.parent_id
WHERE w2.name = 'screw';
-- and word.lang_id = 2
不幸的是,结果不包含我键入的单词。此外,它还显示所有数据集,而不仅仅是使用特定语言的数据集。您可以修改下面的查询以获得答案
DECLARE @FromLanguageId SMALLINT = 2; --german
DECLARE @ToLanguageId SMALLINT = 3; --french
DECLARE @NAME NVARCHAR(300) = 'schraube';
--DECLARE @FromLanguageId SMALLINT = 1; --english
--DECLARE @ToLanguageId SMALLINT = 3; --french
--DECLARE @NAME NVARCHAR(300) = 'screw';
--Get the mathing record
;
WITH ctematch
AS (
--gets the matching record (child or parent)
SELECT match.*
FROM [word] match
WHERE match.NAME LIKE @NAME),
--Join its sibling , parent and childs
ctefamilydata
AS (SELECT *
FROM ctematch match
UNION
--Parent
SELECT parent.*
FROM ctematch match
INNER JOIN [word] parent
ON match.[parent_id] = parent.[id]
UNION
--Child
SELECT child.*
FROM ctematch match
INNER JOIN [word] child
ON child.[parent_id] = match.[id]
UNION
--Siblings
SELECT siblings.*
FROM ctematch match
INNER JOIN [word] siblings
ON match.[parent_id] = siblings.[parent_id])
--Filter and get the data
SELECT *
FROM ctefamilydata Cte
WHERE Cte.[lang_id] = @ToLanguageId
OR Cte.[lang_id] = @FromLanguageId
搜索“递归公共表表达式”