SQL在同一个表中递归选择

时间:2017-07-27 11:20:49

标签: mysql sql

我确实有一个包含该结构的表:

pedido_venda_restaurante

  • idpedido_venda_restaurante,Index PK

  • idpedido_venda_restaurante_principal,FK(指向同一张桌的idpedido_venda_restaurante

  • codigo_pv_interno VarChar UNIQUE

我查询的目标是由用户输入的codigo_pv_interno查询应返回的所有行:

  • 输入codigo_pv_interno;
  • idpedido_venda_restaurante_principal等于idpedido_venda_restaurante_principal所在行的codigo_pv_interno;
  • idpedido_venda_restaurante_principal等于idpedido_venda_restaurante所在行的codigo_pv_interno;

这意味着查询应该返回自己,孩子(如果存在),父亲(如果存在)和兄弟(如果存在)

SELECT
    idpedido_venda_restaurante
    ,codigo_pv_interno
    ,idpedido_venda_restaurante_principal
FROM pedido_venda_restaurante
WHERE idpedido_venda_restaurante IN (SELECT
        pedido_origem.idpedido_venda_restaurante
    FROM pedido_venda_restaurante AS pedido_origem
    WHERE pedido_origem.codigo_pv_interno = '003')
OR idpedido_venda_restaurante IN (SELECT
        idpedido_venda_restaurante
    FROM pedido_venda_restaurante
    WHERE idpedido_venda_restaurante_principal = (SELECT
            idpedido_venda_restaurante_principal
        FROM pedido_venda_restaurante
        WHERE codigo_pv_interno = '003'))
OR idpedido_venda_restaurante IN (SELECT
        idpedido_venda_restaurante
    FROM pedido_venda_restaurante
    WHERE idpedido_venda_restaurante = (SELECT
            idpedido_venda_restaurante_principal
        FROM pedido_venda_restaurante
        WHERE codigo_pv_interno = '003'))
OR idpedido_venda_restaurante_principal = (SELECT
        pedido_origem.idpedido_venda_restaurante
    FROM pedido_venda_restaurante AS pedido_origem
    WHERE pedido_origem.codigo_pv_interno = '003');

实际上这个查询已经运行并返回了所需的结果,但由于我对SQL的了解不多,我认为应该存在一种有效的方法。

1 个答案:

答案 0 :(得分:0)

您可以使用INNER JOIN检查表中是否存在元素:

SELECT pvr.idpedido_venda_restaurante, pvr.codigo_pv_interno, pvr.idpedido_venda_restaurante_principal
FROM pedido_venda_restaurante pvr
INNER JOIN pedido_venda_restaurante as pedido_origem
ON pedido_origem.idpedido_venda_restaurante  = pvr.idpedido_venda_restaurante
WHERE pvr.pedido_origem.codigo_pv_interno = '003'

对要搜索值的其他表重复此过程