Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.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_Tsql_Sql Server 2012 Express - Fatal编程技术网

Sql 将计算列与其未计算版本合并以显示另一个具有名称的列

Sql 将计算列与其未计算版本合并以显示另一个具有名称的列,sql,tsql,sql-server-2012-express,Sql,Tsql,Sql Server 2012 Express,我不知道该怎么说,让我举个简单的例子试试。我有3个表,其中包含以下列: table1 ID_TRANSACTION ID_PRODUCT SALES_DATA table2 ID_PRODUCT PRODUCT_DATA ID_CATEGORY table3 ID_CATEGORY NAME_CATEGORY CODE_CATEGORY LEVEL 表2中的类别有不同的级别,每个级别增加三个额外数字。因此,第一级1以“001”开头,而第二级有六个“001001”第三级“001001001”

我不知道该怎么说,让我举个简单的例子试试。我有3个表,其中包含以下列:

table1
ID_TRANSACTION
ID_PRODUCT
SALES_DATA

table2
ID_PRODUCT
PRODUCT_DATA
ID_CATEGORY

table3
ID_CATEGORY
NAME_CATEGORY
CODE_CATEGORY
LEVEL
表2中的类别有不同的级别,每个级别增加三个额外数字。因此,第一级1以“001”开头,而第二级有六个“001001”第三级“001001001”等。我需要的是一个查询,该查询将从第二级向我提供销售数据、产品数据和名称类别,即使产品处于更高级别。假设一个产品有代码类别002005021,我需要名称类别002005,而不是完整的名称类别002005021。我知道如何提取这些数字:

SUBSTRING(tree.KOD_TREE,1,6)
但是我如何让它显示与6位代码类别相关的名称类别,而不是9位代码类别

没有该选项的代码将类似于:

SELECT
table1.SALES_DATA
table2.PRODUCT_DATA
table3.NAME_CATEGORY
LVL2_NAME_CATEGORY /* (here I would put the NAME_CATEGORY from lower level) */

FROM
db.table1
INNER JOIN db.table2 ON table1.ID_PRODUCT = table2.ID_PRODUCT
INNER JOIN db.table3 ON table2.ID_CATEGORY = table3.ID_CATEGORY

考虑在表3上使用
子字符串()
值进行
左连接

SELECT 
       table1.SALES_DATA,
       table2.PRODUCT_DATA,
       table3.NAME_CATEGORY,
       levelsub.NAME_CATEGORY AS LOWER_LEVEL_CATEGORY

FROM db.table1 
INNER JOIN db.table2 ON table1.ID_PRODUCT = table2.ID_PRODUCT 
INNER JOIN db.table3 ON table2.ID_CATEGORY = table3.ID_CATEGORY
LEFT JOIN db.table3 AS levelsub 
       ON levelsub.CODE_CATEGORY = SUBSTRING(table3.CODE_CATEGORY,1,6)

请标记您使用的RDM(SQL Server、Oracle、MySQL、PostGreSQL、SQLite、DB2、Teradata、MS Access等),因为每个RDM都有不同的SQL方言和不同的字符串函数。设计看起来很糟糕吗?为什么不添加另一列级别信息并使用它来过滤数据?添加了标签。如果我需要过滤,还有另一个专栏,但这不是我想要的。假设你有一级的“车辆”,然后是二级的“汽车”、“自行车”、“魔毯”,然后在较低的级别上,你继续将它们划分为更小的类别,比如车辆>汽车>马自达>2016。如果我查询名称类别,我会得到“2016”,但我想要的是“汽车”。Parfait提出的自连接解决了这个问题。我想我在主帖中的措辞很糟糕。非常感谢!这正是我正在搜索的内容,但由于缺少SQL speak,所以找不到。我创建了一个新的视图并引用了它,但是使用self-join我不会创建任何不必要的视图。不,不,我们不希望这样。很高兴我能帮忙。