使用第一个表的值从两个表中选择正确的SQL语法



我正在尝试在SQL Server中执行SQL查询。

  1. 使用第一个表中的值从两个表中提取数据以查询第二个表的正确语法是什么?

  2. 我可以从第一个表列提取文本字符串并用于查询第二个表吗?如果是,我的语法正确吗?

请赐教。谢谢。

我把代码和我的笔记贴在下面。我用tableAtableB替换了实际的表名,以便更容易阅读/理解。

/* Select what we need from tableA */
SELECT 
sku, sku_desc, whse_code, create_stamp, stg_pm_f_id as a 
FROM  
tableA 
WHERE 
DATEDIFF(day,create_stamp,GETDATE()) < 365 
AND stg_status = 5 

使用从tableAstg_pm_f_id的文本字符串中提取的键值来选择tableB

owner_muid列包含stg_pm_f_id作为

wms|stg_pm_f|WHSE1|885563

元素以竖条分隔,最后一个元素是我们需要查询的tableB,即885563

的例子:

select 
column_name, group_by_key 
from 
tableB 
where
column_name is not null
and owner_muid like '%885563%' 
order by 
create_stamp desc
SELECT  
column_name, group_by_key 
FROM
tableB 
WHERE 
column_name IS NOT NULL 
AND owner_muid LIKE RIGHT(A.stg_pm_f, CHARINDEX('|', (REVERSE(A.stg_pm_f_id))) - 1)  /*locate the last vertical bar and grab everything to the right*/
ORDER BY 
create_stamp DESC

将最终结果显示为一行:

a.sku, a.sku_desc, a.whse_code, a.create_stamp, b.column_name, b.group_by_key

我得到不同的错误取决于我如何配置,但基本上我不知道足够的SQL尚未执行所需的命令,希望有人能教育我,谢谢。

一般来说,你想要做的事情被称为"JOIN"一般看起来像这样:

select «column list»
from tableA as a
join tableB as b
on «join criteria predicates»
...

让我们一步一步地把它应用到你的例子中。

/* Select what we need from tableA */
SELECT 
sku, sku_desc, whse_code, create_stamp, stg_pm_f_id as a 
FROM  
tableA 
WHERE 
DATEDIFF(day,create_stamp,GETDATE()) < 365 
AND stg_status = 5 

在我们开始连接另一个表之前,我想要注意,正如所写的那样,DATEDIFF谓词将对性能产生不利影响。为什么?你要求数据库对每一行进行计算。但是看看它,一个简单的重写将会有所帮助。您要求的是去年的行,因此可以将其重写为create_stamp > DATEDIFF(day, -365, GETDATE())。数据库足够聪明,可以在查询开始时计算一次该值,然后在查询执行时使用它来比较行。

现在进入join:

SELECT 
a.sku, a.sku_desc, a.whse_code, a.create_stamp, b.column_name, b.group_by_key 
FROM  
tableA as a
JOIN
tableB as b
ON
/*locate the last vertical bar and grab everything to the right*/
b.owner_muid LIKE RIGHT(a.stg_pm_f, CHARINDEX('|', (REVERSE(a.stg_pm_f_id))) - 1)
WHERE 
a.create_stamp > DATEDIFF(day, -365, GETDATE())
AND a.stg_status = 5
AND b.column_name IS NOT NULL
ORDER BY 
b.create_stamp DESC;

将其分解,我们说"从tableB中获取column_name IS NOT NULL(来自where子句)和owner_muid匹配管道分隔列stg_pm_f_id中的最后一个元素的行"。


这里的另一个注释-存在的数据违反了第一范式。也就是说,如果数据的一个元素是管道分隔的元素,而这些元素本身就是数据元素,那么这个查询a)很难编写,b)不太可能执行得很好。如果在您的控制范围内,我建议重新设计这两个表,将管道分隔列表中的每个元素拉出来,并将它们提升到各自表中的一级列。

相关内容

  • 没有找到相关文章

最新更新