我正在尝试在SQL Server中执行SQL查询。
-
使用第一个表中的值从两个表中提取数据以查询第二个表的正确语法是什么?
-
我可以从第一个表列提取文本字符串并用于查询第二个表吗?如果是,我的语法正确吗?
请赐教。谢谢。
我把代码和我的笔记贴在下面。我用tableA
和tableB
替换了实际的表名,以便更容易阅读/理解。
/* 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
使用从tableA
的stg_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)不太可能执行得很好。如果在您的控制范围内,我建议重新设计这两个表,将管道分隔列表中的每个元素拉出来,并将它们提升到各自表中的一级列。