Sql 基于四个键的四列
我首先根据由5个数字和一年(+B)组成的信息制作了一个表格: 所以你会得到: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
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的列。它不是很清楚,但我认为它在另一个未显示的表中(其他表)@JacobHOthertable
的别名为a
。on
子句已经使用了该表中的一列。@GordonLinoff啊,你说得对。这毫无意义。这可能是查询中的问题所在,因为表是通过该列上的左连接连接到自身的。因此出现了“一行获取值,另一行为空”的问题。对不起,这是一个输入错误。我的意思是b.A1=a.FileName当然……我不明白#temp
没有名为FileName
@GordonLinoff的列。它不是很清楚,但我认为它在另一个未显示的表中(其他表)@JacobHOthertable
的别名为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]