繁体   English   中英

将SQL内部联接和外部联接组合在多个列上

[英]Combining sql inner and outer joins over multiple columns

我在如何在sql的select语句中联接以下表的语法上遇到问题。 关系如下:表a具有与bd的内部联接。 b也具有c的内部联接。 e使用来自bd的字段向a,b,c,d左连接。

这是代码。 重要的部分在底部。 其余只是表中的字段和计算所得的字段。 它似乎几乎可以工作,因为它可以检索数据。 但是有一点不太正确,因为在删除Futures_Orders行时基础就是删除Broker_Commissions行。请记住,在Futures_Orders上没有任何其他表设置删除级联。

SELECT "Futures_Orders"."Date"
    ,"Futures_Orders"."Symbol"
    ,"Futures_Orders"."Contract_Mth"
    ,"Futures_Orders"."Send_To_Broker"
    ,"Futures_Orders"."Order-Id"
    ,"Futures_Orders"."Broker"
    ,"Futures_Orders"."Order_Action"
    ,"Futures_Orders"."No_Contracts"
    ,"Futures_Orders"."Order_Price"
    ,"Futures_Orders"."Trade_Type"
    ,CASE "Futures_Orders"."Order_Action"
        WHEN 'b'
            THEN 's'
        ELSE 'b'
        END "If_Done_Action"
    ,"Futures_Orders"."If_Done_Price"
    ,"Futures_Orders"."No_Contracts" * (
        CASE "Contract_Details"."USIntRates"
            WHEN 'n'
                THEN ABS("Futures_Orders"."Order_Price" - "Futures_Orders"."If_Done_Price") / "Contract_Details"."MinTick"
            ELSE ABS(ABS(TRUNCATE (
                            "Futures_Orders"."Order_Price"
                            ,0
                            ) - TRUNCATE (
                            "Futures_Orders"."If_Done_Price"
                            ,0
                            )) * "Contract_Details"."MinTick" - CASE 
                        WHEN "Contract_Details"."Symbol" IN (
                                'FV'
                                ,'TU'
                                )
                            THEN 400
                        ELSE 200
                        END * ABS("Futures_Orders"."Order_Price" - TRUNCATE (
                            "Futures_Orders"."Order_Price"
                            ,0
                            ) - "Futures_Orders"."If_Done_Price" + TRUNCATE (
                            "Futures_Orders"."If_Done_Price"
                            ,0
                            )))
            END * "Contract_Details"."MinTickVal" / "FX_Rates"."Rate" + CASE 
            WHEN "Broker_Commissions"."Commission" IS NULL
                OR "Broker_Commissions"."Commission_AUD" + "Broker_Commissions"."Commission" = 0
                THEN "Broker"."Commission"
            ELSE "Broker_Commissions"."Commission_AUD" + "Broker_Commissions"."Commission" / "FX_Rates"."Rate"
            END * 2
        ) "Risk"
    ,"Futures_Orders"."Trade_Reason"
    ,"Contract_Details"."MinTick"
    ,"Contract_Details"."MinTickVal"
    ,"Contract_Details"."Symbol"
    ,"Contract_Details"."Currency"
    ,"FX_Rates"."Code"
    ,"Broker"."Broker"
    ,"Broker_Commissions"."Symbol"
    ,"Broker_Commissions"."Broker"
    ,"Broker_Commissions"."ID"
FROM "Futures_Orders"
    ,"Contract_Details"
    ,"Broker"
    ,"FX_Rates"
LEFT JOIN "Broker_Commissions" ON "Broker_Commissions"."Broker" = "Broker"."Broker"
    AND "Broker_Commissions"."Symbol" = "Contract_Details"."Symbol"
WHERE "Contract_Details"."Symbol" = "Futures_Orders"."Symbol"
    AND "Broker"."Broker" = "Futures_Orders"."Broker"
    AND "FX_Rates"."Code" = "Contract_Details"."Currency"

我认为您需要与此类似的东西。

每个<field>不同,但是您没有提供

 SELECT 
 FROM a
 INNER JOIN b
         ON a.<field> = b.<field>
 INNER JOIN d
         ON a.<field> = d.<field>
 INNER JOIN c
         ON b.<field> = c.<field>
 LEFT JOIN e
         ON e.<field> = b.<field>
        AND e.<field> = d.<field>

假设您要联接的列在两个表中都被命名为相同的名称(并且没有重复引起歧义),我们可以使用NATURAL来简化语法。

d NATURAL LEFT JOIN (a NATURAL JOIN (b NATURAL JOIN c) NATURAL JOIN d)

您可以使用JOIN X ON (COLA = COLB)语法替换NATURAL ... JOIN X

您的实际示例有所不同,可以这样写:

FROM "Futures_Orders" NATURAL JOIN "Contract_Details"
 NATURAL JOIN "Broker"
 INNER JOIN "FX_Rates" ON ("FX_Rates"."Code" = "Contract_Details"."Currency")
 NATURAL LEFT JOIN "Broker_Commissions"

如果您使用NATURAL Join,则必须在查询中引用具有相同名称的列,而不必使用其表名。

您提到了Base(OpenOffice或LibreOffice),它具有自己的预处理器和语法差异,可以修改查询,有时甚至是错误地。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM