Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.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
mysql-通用表表达式:模拟完全联接_Mysql_Sql_Common Table Expression - Fatal编程技术网

mysql-通用表表达式:模拟完全联接

mysql-通用表表达式:模拟完全联接,mysql,sql,common-table-expression,Mysql,Sql,Common Table Expression,我有多个20多个cte,我需要将它们连接在一起以并排输出行 WITH cte_lnz AS (SELECT n.name, ROW_NUMBER() OVER (ORDER BY e.id) AS rn_lnz FROM entries e LEFT JOIN nodes n ON n.id = e.node_id LEFT JOIN attribs a ON a.id = e.attrib_id WHERE a.name = 'LOCATION' AND e.value = 'Gruber

我有多个20多个cte,我需要将它们连接在一起以并排输出行

WITH 
cte_lnz AS (SELECT n.name, ROW_NUMBER() OVER (ORDER BY e.id) AS rn_lnz FROM entries e LEFT JOIN nodes n ON n.id = e.node_id LEFT JOIN attribs a ON a.id = e.attrib_id 
WHERE a.name = 'LOCATION' AND e.value = 'Gruberstrasse' AND DATE(ts) = CURRENT_DATE ORDER BY e.id         
), 
cte_wbg AS (SELECT n.name, ROW_NUMBER() OVER (ORDER BY e.id) AS rn_wbg FROM entries e LEFT JOIN nodes n ON n.id = e.node_id LEFT JOIN attribs a ON a.id = e.attrib_id
WHERE  a.name = 'LOCATION' AND e.value = 'Wienerberg' AND DATE(ts) = CURRENT_DATE ORDER BY e.id         
), 
cte_gbg AS ( SELECT n.name, ROW_NUMBER() OVER (ORDER BY e.id) AS rn_gbg FROM entries e LEFT JOIN nodes n ON n.id = e.node_id LEFT JOIN attribs a ON a.id = e.attrib_id
WHERE  a.name = 'LOCATION' AND e.value = 'Geiselberg' AND DATE(ts) = CURRENT_DATE ORDER BY e.id        
),
cte_vie AS ( SELECT n.name, ROW_NUMBER() OVER (ORDER BY e.id) AS rn_vie FROM entries e LEFT JOIN nodes n ON n.id = e.node_id LEFT JOIN attribs a ON a.id = e.attrib_id
WHERE  a.name = 'LOCATION' AND e.value IN ('Geiselberg', 'Wienerberg') AND DATE(ts) = CURRENT_DATE ORDER BY e.id         
)
这适用于前两个cte

-- simulated full join
    SELECT lnz.name LNZ, wbg.name WBG
    FROM cte_lnz lnz LEFT JOIN cte_wbg wbg
    ON wbg.rn_wbg = lnz.rn_lnz
    UNION
    SELECT lnz.name LNZ, wbg.name WBG
    FROM cte_wbg wbg LEFT JOIN cte_lnz lnz
    ON wbg.rn_wbg = lnz.rn_lnz

+----------------------+------------------------------+
| LNZ                  | WBG                          |
+----------------------+------------------------------+
| STP17T1_SGKKT1       | AIXHVBDBT                    |
| AIXSAGRU3            | KUG0167_JBOSS-T4             |
| ARR5S1P9_TIC         | KUG0169_RMAN_HA              |
| AIXBUILDHOST         | KUG0121_ZPVTT1               |
这给出了一个错误

    SELECT lnz.name LNZ, wbg.name WBG
    FROM cte_lnz lnz LEFT JOIN cte_wbg wbg
    ON wbg.rn_wbg = lnz.rn_lnz
    UNION
    SELECT lnz.name LNZ, wbg.name WBG
    FROM cte_wbg wbg LEFT JOIN cte_lnz lnz
    ON wbg.rn_wbg = lnz.rn_lnz
-- just a placeholder
    SELECT gbg.name GBG, vie.name VIE
    FROM cte_gbg gbg LEFT JOIN cte_vie vie
    ON vie.rn_vie = gbg.rn_gbg
    UNION
    SELECT gbg.name GBG, vie.name VIE
    FROM cte_vie vie LEFT JOIN cte_gbg gbg
    ON vie.rn_vie = gbg.rn_gbg

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'SELECT gbg.name GBG, vie.name VIE
FROM cte_gbg gbg LEFT JOIN cte_vie vie
ON vie.' at line 53
那么我如何将其他cte添加到游戏中呢?

完全联接的并集近似仍然存在?这是一种糟糕的方法——功能上不完全相同,而且比必要的成本要高得多

对于您的问题,请使用union all和聚合。一种方法是:

SELECT MAX(CASE WHEN which = 'lnz' THEN name END) as lnz,
       MAX(CASE WHEN which = 'wbg' THEN name END) as wbg,
       . . .
FROM ((SELECT 'lnz' as which, rn, lnz.name
       FROM cte_lnz lnz 
      ) UNION ALL
      (SELECT 'wbg', rn, wbg.name
       FROM cte_wbg wbg
      ) UNION ALL
      . . .
     ) n
GROUP BY rn;

添加更多CTE就像在子查询中添加更多UNION ALL子句一样简单,然后在外部查询中添加更多MAXCASE表达式。

不起作用…->->->选择MAXCASE which='lnz',然后将END命名为lnz,->MAXCASE which='wbg',然后将END命名为wbg->从中选择'lnz',rn,lnz.name->FROM cte_lnz lnz lnz->UNION ALL->选择'wbg',rn,wbg.name->FROM cte_wbg wbg->->->->n->按rn分组;错误1054 42S22:“字段列表”中的未知列“rn”这看起来更像ms sqlserver语法,但我要求MYSQL@flynn1973 . . . Tis是标准语法,应该适用于任何数据库。当然,您需要为rn指定正确的名称。我只是对所有CTE使用了相同的名称,因为给它取不同的名称似乎没有用。啊,好了,现在它可以工作了,仍然不知道如何添加额外的UNION all子句。