0
JOIN (select distinct to_number(unnest(string_to_array(p_cmsid, ',')))) x(SUPPLIER_CMSID)
                 USING (SUPPLIER_CMSID)
                  JOIN (select distinct unnest(string_to_array(p_service_name, ','))) y(NET_SERVICE_NAME)
                 USING (NET_SERVICE_NAME)

任何人请解释这个查询

4

1 回答 1

2

实质上,该片段在一个较大的 FROM 子句中显示了 2 个 JOINS。

FROM DATA D
JOIN (<subquery>) x(SUPPLIER_CMSID)
     USING (SUPPLIER_CMSID)
JOIN (<subquery>) y(NET_SERVICE_NAME)
     USING (NET_SERVICE_NAME)

这里需要注意的事项:

  1. USING 是一种 JOIN 语法,通过两侧的同名列隐式连接,例如第一个转换为
    ON D.SUPPLIER_CMSID = x.SUPPLIER_CMSID

  2. PostgreSQL 和 SQL Server 允许您在命名派生表中的列的同时为其命名。x(SUPPLIER_CMSID)将派生表别名为 ,x同时将其中的单个列别名为SUPPLIER_CMSID.

其他部分:

  1. unnest/string_to_array是字符串到数组和数组到行的运算符。结合起来,它可以将分隔字符串转换为多行结果集
  2. to_number - 将字符串转换为数字。当与 unnest 一起使用时,它将每行的奇异列从字符串转换为数字。但是,您的代码片段缺少格式(第二个参数)

如果整个代码部分有效(不确定是否to_number()在该上下文中),那么 JOIN 将通过接收两个字符串作为过滤器,p_cmsid并且p_servicename大致相当于

FROM DATA D
WHERE SUPPLIER_CMSID = {list in p_cms_id}
  AND NET_SERVICE_NAME = {list in p_servicename}

例子

这是一个显示to_number(text,text)unnest(array)一起string_to_array(string, delimiter)工作的示例:SQL Fiddle

select *
  from (select to_number(
               unnest(
               string_to_array('123,433,434',',')),'999')) tbl(col);
于 2012-12-12T06:02:40.940 回答