Join 如何查询具有父子关系的表

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 | 所以螺旋是没有父词的主词。其

情况

我有一个名为“word”的表,其中包含一个带有相关翻译的单词

| 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
搜索“递归公共表表达式”