Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 两个表之间的链接_Sql_Sql Server_Sql Server 2016 - Fatal编程技术网

Sql 两个表之间的链接

Sql 两个表之间的链接,sql,sql-server,sql-server-2016,Sql,Sql Server,Sql Server 2016,我有两张桌子: 表A包含所有产品的说明: codeProduct description 1 ok 2 yes 表B包含产品之间的层次结构,仅包含代码: level_1 level_2 level_3 level_4 1 2 23 75 1 2 53 85 如何获得包含每个级别描述的最终表格 level_1 description_1 level_2

我有两张桌子:

表A包含所有产品的说明:

codeProduct   description

    1              ok
    2              yes
表B包含产品之间的层次结构,仅包含代码:

level_1 level_2 level_3 level_4
1       2       23      75
1       2       53      85
如何获得包含每个级别描述的最终表格

level_1 description_1 level_2 description_2 level_3 description_3 level_4 description_4

每次需要表B中某列的值时,都需要多次使用表a

select b.level_1
    , a1.description description_1
    , b.level_2
    , a2.description description_2
    , b.level_3
    , a3.description description_3
    , b.level_4 
    , a4.description description_4 
from  TableB b 
left join  TableA a1 on a1.codeProduct = b.level_1 
left join  TableA a2 on a2.codeProduct = b.level_2 
left join  TableA a3 on a3.codeProduct = b.level_3 
left join  TableA a4 on a4.codeProduct = b.level_4  
如果两个表之间的值不完全匹配,则使用左联接;如果有所有的macthing值,则使用内部联接

select b.level_1
    , a1.description description_1
    , b.level_2
    , a2.description description_2
    , b.level_3
    , a3.description description_3
    , b.level_4 
    , a4.description description_4 
from  TableB b 
INNER join  TableA a1 on a1.codeProduct = b.level_1 
INNER join  TableA a2 on a2.codeProduct = b.level_2 
INNER join  TableA a3 on a3.codeProduct = b.level_3 
INNER join  TableA a4 on a4.codeProduct = b.level_4  

每次需要表B中某列的值时,都需要多次使用表a

select b.level_1
    , a1.description description_1
    , b.level_2
    , a2.description description_2
    , b.level_3
    , a3.description description_3
    , b.level_4 
    , a4.description description_4 
from  TableB b 
left join  TableA a1 on a1.codeProduct = b.level_1 
left join  TableA a2 on a2.codeProduct = b.level_2 
left join  TableA a3 on a3.codeProduct = b.level_3 
left join  TableA a4 on a4.codeProduct = b.level_4  
如果两个表之间的值不完全匹配,则使用左联接;如果有所有的macthing值,则使用内部联接

select b.level_1
    , a1.description description_1
    , b.level_2
    , a2.description description_2
    , b.level_3
    , a3.description description_3
    , b.level_4 
    , a4.description description_4 
from  TableB b 
INNER join  TableA a1 on a1.codeProduct = b.level_1 
INNER join  TableA a2 on a2.codeProduct = b.level_2 
INNER join  TableA a3 on a3.codeProduct = b.level_3 
INNER join  TableA a4 on a4.codeProduct = b.level_4  
试试这个:

CREATE TABLE #TABLEA
(
  CODEPRODUCT INT NOT NULL
, DESCRIPTION VARCHAR (100) NOT NULL
);

INSERT INTO #TABLEA VALUES (1, 'ok') ;
INSERT INTO #TABLEA VALUES (2, 'yes');

CREATE TABLE #TABLEB
(
  LEVEL_1 INT NOT NULL
, LEVEL_2 INT NOT NULL
, LEVEL_3 INT NOT NULL
, LEVEL_4 INT NOT NULL
);

INSERT INTO #TABLEB VALUES(1, 2, 23, 75) , (1, 2, 53, 85);

SELECT #TABLEB.LEVEL_1
     , TA_L1.DESCRIPTION AS DESCRIPTION1
     , #TABLEB.LEVEL_2
     , TA_L2.DESCRIPTION AS DESCRIPTION2
     , #TABLEB.LEVEL_3
     , TA_L3.DESCRIPTION AS DESCRIPTION3
     , #TABLEB.LEVEL_4
     , TA_L4.DESCRIPTION AS DESCRIPTION4
FROM #TABLEB
LEFT JOIN #TABLEA TA_L1
ON #TABLEB.LEVEL_1 = TA_L1.CODEPRODUCT
LEFT JOIN #TABLEA TA_L2
ON #TABLEB.LEVEL_2 = TA_L2.CODEPRODUCT
LEFT JOIN #TABLEA TA_L3
ON #TABLEB.LEVEL_3 = TA_L3.CODEPRODUCT
LEFT JOIN #TABLEA TA_L4
ON #TABLEB.LEVEL_4 = TA_L4.CODEPRODUCT;
结果:

LEVEL_1, DESCRIPTION1, LEVEL_2, DESCRIPTION2, LEVEL_3, DESCRIPTION3, LEVEL_4, DESCRIPTION4
    1   ok  2   yes 23  NULL    75  NULL
    1   ok  2   yes 53  NULL    85  NULL
试试这个:

CREATE TABLE #TABLEA
(
  CODEPRODUCT INT NOT NULL
, DESCRIPTION VARCHAR (100) NOT NULL
);

INSERT INTO #TABLEA VALUES (1, 'ok') ;
INSERT INTO #TABLEA VALUES (2, 'yes');

CREATE TABLE #TABLEB
(
  LEVEL_1 INT NOT NULL
, LEVEL_2 INT NOT NULL
, LEVEL_3 INT NOT NULL
, LEVEL_4 INT NOT NULL
);

INSERT INTO #TABLEB VALUES(1, 2, 23, 75) , (1, 2, 53, 85);

SELECT #TABLEB.LEVEL_1
     , TA_L1.DESCRIPTION AS DESCRIPTION1
     , #TABLEB.LEVEL_2
     , TA_L2.DESCRIPTION AS DESCRIPTION2
     , #TABLEB.LEVEL_3
     , TA_L3.DESCRIPTION AS DESCRIPTION3
     , #TABLEB.LEVEL_4
     , TA_L4.DESCRIPTION AS DESCRIPTION4
FROM #TABLEB
LEFT JOIN #TABLEA TA_L1
ON #TABLEB.LEVEL_1 = TA_L1.CODEPRODUCT
LEFT JOIN #TABLEA TA_L2
ON #TABLEB.LEVEL_2 = TA_L2.CODEPRODUCT
LEFT JOIN #TABLEA TA_L3
ON #TABLEB.LEVEL_3 = TA_L3.CODEPRODUCT
LEFT JOIN #TABLEA TA_L4
ON #TABLEB.LEVEL_4 = TA_L4.CODEPRODUCT;
结果:

LEVEL_1, DESCRIPTION1, LEVEL_2, DESCRIPTION2, LEVEL_3, DESCRIPTION3, LEVEL_4, DESCRIPTION4
    1   ok  2   yes 23  NULL    75  NULL
    1   ok  2   yes 53  NULL    85  NULL

你在这里的预期结果是什么?您似乎已经告诉我们您想要什么列,但没有告诉我们所述列中包含的内容。到目前为止,你一直在努力实现你所追求的目标,为什么没有成功?您是否收到错误、意外结果或其他信息?提示:内部联接您是否只是在寻找交叉联接?请分享你期望的结果。你期望的结果是什么?您似乎已经告诉我们您想要什么列,但没有告诉我们所述列中包含的内容。到目前为止,你一直在努力实现你所追求的目标,为什么没有成功?您是否收到错误、意外结果或其他信息?提示:内部联接您是否只是在寻找交叉联接?请共享所需的结果。我在使用内部联接时遇到重复行的问题。这正是我的问题,如果你真的有重复的行。。然后您可以添加不同的。。无论如何,请检查您是否已正确加入表。@csharp,检查表A上的数据完整性。从选择codeProduct开始,将*计数为表中的cnt按codeProduct分组按cnt desc排序,以查看该表是否是重复值的来源。使用内部联接时,重复行有问题。这正是我的问题,如果你真的有重复的行。。然后您可以添加不同的。。无论如何,请检查您是否已正确加入表。@csharp,检查表A上的数据完整性。从选择codeProduct开始,将*从表中计算为cnt按代码分组产品顺序按cnt desc查看该表是否是重复值的来源。您的答案有正确的代码,但是,如果您对代码的正确性进行解释,那么对于OP和将来可能遇到此问题的任何人都会更有用。请参阅scaisEdge的答案,其中的代码与您的代码基本相同,以了解我的意思。您的答案的代码正确,但如果您解释代码正确的原因,将对OP和将来可能遇到此问题的任何人更有用。请看斯凯里奇的答案,其中的代码与您的基本相同,以了解我的意思。