2015-03-30 62 views
0

我目前有多个下面的查询(实际代码的小片段),我多次执行UNION ALL SELECT,因为订单可能有1到5个与之相关的贷款。但是,我想知道如何动态引入LoanOrder(如果可能),我不会使用UNION ALL并只调整LoanOrder?这样,如果实际上只有一个与订单关联的贷款,我不会再运行两个额外的SELECT报表。虽然我目前的方法有效,但我只是试图更好地优化并为我未来的工作学习新东西。提前致谢!动态SQL JOIN而不是UNION

SELECT DISTINCT 
    -- 1st Loan Premiums 
    L.LoanOrder 
    ,'Loan Premium' AS 'Type' 
    ,'Policies:' AS 'Type1' 
FROM 
    Orders O 
    LEFT JOIN Loan L 
     ON O.OrdersID = L.OrdersID 
     AND L.LoanOrder = 1 
UNION ALL 
SELECT DISTINCT 
    -- 2nd Loan Premiums 
    L.LoanOrder 
    ,'Loan Premium' AS 'Type' 
    ,'Policies:' AS 'Type1' 
FROM 
    Orders O 
    LEFT JOIN Loan L 
     ON O.OrdersID = L.OrdersID 
     AND L.LoanOrder = 2 
UNION ALL 
SELECT DISTINCT 
    -- 3rd Loan Premiums 
    L.LoanOrder 
    ,'Loan Premium' AS 'Type' 
    ,'Policies:' AS 'Type1' 
FROM 
    Orders O 
    LEFT JOIN Loan L 
     ON O.OrdersID = L.OrdersID 
     AND L.LoanOrder = 3 
UNION ALL 
SELECT DISTINCT 
    -- 4th Loan Premiums 
    L.LoanOrder 
    ,'Loan Premium' AS 'Type' 
    ,'Policies:' AS 'Type1' 
FROM 
    Orders O 
    LEFT JOIN Loan L 
     ON O.OrdersID = L.OrdersID 
     AND L.LoanOrder = 4 
UNION ALL 
SELECT DISTINCT 
    -- 5th Loan Premiums 
    L.LoanOrder 
    ,'Loan Premium' AS 'Type' 
    ,'Policies:' AS 'Type1' 
FROM 
    Orders O 
    LEFT JOIN Loan L 
     ON O.OrdersID = L.OrdersID 
     AND L.LoanOrder = 5 
+3

好像改变是L.LoadOrder =#唯一;也许我不明白这个问题,但你不能只写: 'SELECT DISTINCT LoanOrder,'Loan Premium','Policies'FROM Orders O LEFT JOIN Loan L ON(O.OrdersID = L.OrdersID AND L .LoanOrder IN(1,2,3,4,5))' 这将为您带来所有订单,并在贷款订单介于1和5之间(包括1和5)的贷款表上存在匹配记录。 – 2015-03-30 18:11:36

+0

此外,如果你只想要订单有贷款的地方,添加以下WHERE子句: ' WHERE L.OrdersID不是NULL' – 2015-03-30 18:15:01

+0

哇,我甚至没有关于使用'IN'运算符。这正是我需要做的,并且不需要多个'UNION'语句。这次真是万分感谢!我会回到现在感觉像个傻瓜。 :) @Kalmino – PicoDeGallo 2015-03-30 18:19:24

回答

4

您似乎根本没有使用Orders表。所以,我觉得您的查询的一个简化版本是:

SELECT L.LoanOrder, 'Loan Premium' AS 'Type', 'Policies:' AS 'Type1' 
FROM Loan L 
WHERE L.LoanOrder IN (1, 2, 3, 4, 5); 

您可能使用orders过滤,但似乎不太可能。

我也删除了distinct - 理由是这可能是不必要的。如果一个LoanOrder可以出现在Loan的多行上,那么您可能需要它。

编辑:

如果确实需要Orders

SELECT DISTINCT L.LoanOrder, 'Loan Premium' AS 'Type', 'Policies:' AS 'Type1' 
FROM Orders o LEFT JOIN 
    Loan L 
    ON O.OrdersID = L.OrdersID AND 
     L.LoanOrder IN (1, 2, 3, 4, 5); 
+0

在完整的查询中,我实际上使用了'Orders'表,我刚刚提供了一个查询的小片段。无论如何,“IN”运算符正是我需要完成的。谢谢! – PicoDeGallo 2015-03-30 18:22:25

2

这有什么错

SELECT DISTINCT 
    L.LoanOrder 
    ,'Loan Premium' AS 'Type' 
    ,'Policies:' AS 'Type1' 
FROM 
    Orders O 
    LEFT JOIN Loan 
    ON O.OrdersID = L.OrdersID 
     AND L.LoanOrder > 0 
     AND L.LoanOrder < 6