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 - Fatal编程技术网

Sql 基于四个键的四列

Sql 基于四个键的四列,sql,sql-server,Sql,Sql Server,我首先根据由5个数字和一年(+B)组成的信息制作了一个表格: 所以你会得到: number5 year A1 A1-1 B1 B1-1 12345 2001 12345-2001 12345-2000 12345-2001B 12345-2000B 23456 2002 23456-2002 23456-2001 23456-2002B 23456-2001B 34569 2003 34569

我首先根据由5个数字和一年(+B)组成的信息制作了一个表格:

所以你会得到:

number5 year   A1          A1-1         B1           B1-1
12345   2001   12345-2001  12345-2000   12345-2001B  12345-2000B   
23456   2002   23456-2002  23456-2001   23456-2002B  23456-2001B
34569   2003   34569-2003  34569-2002   34569-2003B  34569-2002B
45678   2004   45678-2004  45678-2003   45678-2004B  45678-2003B
然后,我将此表与其他信息合并:

FileName        Value    Brand
12345-2001      10000    Apple
23456-2002      30409    Microsoft
34569-2003      09283    Microsoft
12345-2001B     20398    Apple
45678-2003B     20384    Apple

SELECT * FROM OtherTable AS a LEFT JOIN #temp AS b ON
b.A1 = a.Filename
但是,这会为一行提供值,为另一行提供空值。我如何编程使其理解,如果我将文件名与A1、A1-1、B1和B1-1列中的一列连接起来,它也会将信息放入新的列中。因此:

Numb5   year   A1            A1-1           B1          B1-1        FileN. Value     Brand    FileN. Value Brand     FileN.        Value  Brand.
12345   2001   12345-2001  12345-2000   12345-2001B  12345-2000B 12345-2001 10000    Apple                        12345-2001B     20398    Apple
我已经尝试了自加入(但可能错误):

所以我想要的是,它在第1行A1中查找值,即:12345-2001,并返回以下值: 品牌价值

然后查找同一行中的第二个值,即:12345-2000,并返回以下值: 品牌价值

但是,我希望它们彼此相邻,因此:

A1   A1-1 B1  B1-1  FileName (A1)  Value (A1)  Brand (A1)  FileName (A1-1) Value (A1-1) Brand (A1-1)  FileName (B1) Value (B1) Brand (B1) FileName (B1-1) Value (B1-1) Brand (B1-1). 

听起来像你在说,当你查询
OtherTable LEFT JOIN#temp
时,一些
OtherTable
记录找不到匹配的
#temp
记录,因此
NULL
单元格显示在
OtherTable
记录旁边,对吗

基于这一理解,您提供的最后一个数据样本以及问题的其余部分,我认为这就是您所寻找的:

SELECT
    T.number5, T.year, T.[A1], T.[A1-1], T.[B1], T.[B1-1]
  , OT1.FileName, OT1.Value, OT1.Brand
  , OT2.FileName, OT2.Value, OT2.Brand
  , OT3.FileName, OT3.Value, OT3.Brand
  , OT4.FileName, OT4.Value, OT4.Brand
FROM #temp AS T
LEFT JOIN OtherTable AS OT1 ON OT1.FileName = T.[A1]
LEFT JOIN OtherTable AS OT2 ON OT2.FileName = T.[A1-1]
LEFT JOIN OtherTable AS OT3 ON OT3.FileName = T.[B1]
LEFT JOIN OtherTable AS OT4 ON OT4.FileName = T.[B1-1]

听起来像你在说,当你查询
OtherTable LEFT JOIN#temp
时,一些
OtherTable
记录找不到匹配的
#temp
记录,因此
NULL
单元格显示在
OtherTable
记录旁边,对吗

基于这一理解,您提供的最后一个数据样本以及问题的其余部分,我认为这就是您所寻找的:

SELECT
    T.number5, T.year, T.[A1], T.[A1-1], T.[B1], T.[B1-1]
  , OT1.FileName, OT1.Value, OT1.Brand
  , OT2.FileName, OT2.Value, OT2.Brand
  , OT3.FileName, OT3.Value, OT3.Brand
  , OT4.FileName, OT4.Value, OT4.Brand
FROM #temp AS T
LEFT JOIN OtherTable AS OT1 ON OT1.FileName = T.[A1]
LEFT JOIN OtherTable AS OT2 ON OT2.FileName = T.[A1-1]
LEFT JOIN OtherTable AS OT3 ON OT3.FileName = T.[B1]
LEFT JOIN OtherTable AS OT4 ON OT4.FileName = T.[B1-1]


我不明白
#temp
没有名为
FileName
@GordonLinoff的列。它不是很清楚,但我认为它在另一个未显示的表中(其他表)@JacobH
Othertable
的别名为
a
on
子句已经使用了该表中的一列。@GordonLinoff啊,你说得对。这毫无意义。这可能是查询中的问题所在,因为表是通过该列上的左连接连接到自身的。因此出现了“一行获取值,另一行为空”的问题。对不起,这是一个输入错误。我的意思是b.A1=a.FileName当然……我不明白
#temp
没有名为
FileName
@GordonLinoff的列。它不是很清楚,但我认为它在另一个未显示的表中(其他表)@JacobH
Othertable
的别名为
a
on
子句已经使用了该表中的一列。@GordonLinoff啊,你说得对。这毫无意义。这可能是查询中的问题所在,因为表是通过该列上的左连接连接到自身的。因此出现了“一行获取值,另一行为空”的问题。对不起,这是一个输入错误。我的意思是b.A1=a.FileName当然..没有空值是可以的。但是,我希望只匹配一行数据,而不是多行数据。因此,我希望查询理解所进行的匹配应该在所有四个键上,并且它应该返回所有四个键上都有值的列。这看起来很接近我,这是一次非常接近的尝试。在读到这篇文章之前,我很难理解这个问题@你试过这个吗?在我看来,12345-2001将提供1行及其其他信息,然后还将提供A1-1、B1、B1-1的其他信息。我认为这是可行的,但由于列名相同,我无法将其保存为新表(选择*INTO..)。有什么技巧和窍门可以让我在Excel文件或Python中测试吗?@Probs,你知道名字了吗,尽管你应该自己做,因为:(1)这是特定于你的表的,人们有时不会在这里发布实际的表/列名,(2)这太简单了,没有什么神秘之处>>非常感谢KtX2SkD。我问它是因为我的专栏比我在这里发布的要多得多,而且现在不断重复。我知道你发布的这个方法,但我想也许有一个更聪明(更快)的方法=DNo有空值是可以的。但是,我希望只匹配一行数据,而不是多行数据。因此,我希望查询理解所进行的匹配应该在所有四个键上,并且它应该返回所有四个键上都有值的列。这看起来很接近我,这是一次非常接近的尝试。在读到这篇文章之前,我很难理解这个问题@你试过这个吗?在我看来,12345-2001将提供1行及其其他信息,然后还将提供A1-1、B1、B1-1的其他信息。我认为这是可行的,但由于列名相同,我无法将其保存为新表(选择*INTO..)。有什么技巧和窍门可以让我在Excel文件或Python中测试吗?@Probs,你知道名字了吗,尽管你应该自己做,因为:(1)这是特定于你的表的,人们有时不会在这里发布实际的表/列名,(2)这太简单了,没有什么神秘之处>>非常感谢KtX2SkD。我问它是因为我的专栏比我在这里发布的要多得多,而且现在不断重复。我知道你发布的这个方法,但我想也许有一个更聪明(更快)的方法=D
SELECT
    T.number5, T.year, T.[A1], T.[A1-1], T.[B1], T.[B1-1]
  , OT1.FileName, OT1.Value, OT1.Brand
  , OT2.FileName, OT2.Value, OT2.Brand
  , OT3.FileName, OT3.Value, OT3.Brand
  , OT4.FileName, OT4.Value, OT4.Brand
FROM #temp AS T
LEFT JOIN OtherTable AS OT1 ON OT1.FileName = T.[A1]
LEFT JOIN OtherTable AS OT2 ON OT2.FileName = T.[A1-1]
LEFT JOIN OtherTable AS OT3 ON OT3.FileName = T.[B1]
LEFT JOIN OtherTable AS OT4 ON OT4.FileName = T.[B1-1]