结合两个SELECT查询连接三个表并占据中间表的前1位

时间:2017-05-15 06:16:06

标签: sql

我有3个表invoice_hdinvoice_dtAccount_Mast。我想使用条件invoice_hdinvoice_dt加入invoice_hd.ID=invoice_dt.INVOICE_ID,以便从AccountCode表中获取Account_Mast

但在将表格invoice_dt加入Account_Mast之前,我想采用top 1 invoice_dt,因为其结果数据包含多条记录。为此我在下面创建了两个选择查询:

select IH.ID,
IH.CODE,
IH.DATE,
C.CCODE      
FROM invoice_hd IH 
LEFT JOIN Currencies C ON C.ID = IH.CURRENCY_ID 
WHERE APPROVAL_FLAG='FL' and IH.code = 'LI/15'


SELECT TOP 1 SID.ID,SID.INVOICE_ID,AM.CODE AS ACCOUNT_CODE 
FROM invoice_dt SID
LEFT JOIN Account_Mast AM ON BAM.ID = SID.ACCOUNT_ID 
WHERE SID.INVOICE_ID = 1028

现在我想将这两个选择查询与条件invoice_hd.ID=invoice_dt.INVOICE_ID组合在一起。有没有办法这样做?

3 个答案:

答案 0 :(得分:1)

那么你可以将查询用作子查询并像表一样加入它,例如:

SELECT
    /* It's better if you avoid use * in the select */
    A.ID,
    A.CODE,
    A.DATE,
    A.CCODE,
    B.ID,
    B.INVOICE_ID,
    B.ACCOUNT_CODE
FROM (
    /* Here your first query */
    SELECT
        IH.ID,
        IH.CODE,
        IH.DATE,
        C.CCODE
    FROM invoice_hd IH 
    LEFT JOIN Currencies C ON C.ID = IH.CURRENCY_ID 
    WHERE APPROVAL_FLAG='FL' and IH.code = 'LI/15'
) AS A
INNER JOIN (
    /* Then your second one */
    SELECT TOP 1
        SID.ID,
        SID.INVOICE_ID,
        AM.CODE AS ACCOUNT_CODE 
    FROM invoice_dt SID
    LEFT JOIN Account_Mast AM ON BAM.ID = SID.ACCOUNT_ID 
    WHERE SID.INVOICE_ID = 1028
) AS B
/* And for last your condition of join */
ON A.ID = B.INVOICE_ID

答案 1 :(得分:1)

如果你说细节线无关紧要(这很奇怪),那么你可以这样做:

SELECT IH.ID, IH.CODE, IH.DATE, C.CCODE, AM.CODE AS ACCOUNT_CODE      
FROM invoice_hd IH 
INNER JOIN (
    SELECT INVOICE_ID, MAX(ACCOUNT_ID) AS ACCOUNT_ID 
    FROM invoice_dt 
    GROUP BY INVOICE_ID) AS DT ON invoice_hd.ID = DT.INVOICE_ID
LEFT JOIN Account_Mast AM ON AM.ID = dt.ACCOUNT_ID 
LEFT JOIN Currencies C ON C.ID = IH.CURRENCY_ID 
WHERE APPROVAL_FLAG='FL' 
AND IH.code = 'LI/15'

答案 2 :(得分:0)

这可以让您了解如何实现这一目标。

SELECT * 
FROM
   (select * from table1) q1 LEFT JOIN 
   (select * from table2) q2 on q1.id=q2.id