とは異なりORDER BY
、ユニオン内の句は、ユニオン全体ではなくWHERE
、ユニオンのその部分 (結合されている単一のSELECT
クエリ)のみに影響します。
ユニオンをサブクエリに入れて、結果をフィルタリングします。
SELECT *
FROM
(
SELECT *
FROM DCHDR AS H
LEFT JOIN DCDTL AS T ON H.DC_No = T.DC_Nos
UNION
SELECT *
FROM DCHDR AS H
RIGHT JOIN DCDTL AS T ON H.DC_No = T.DC_Nos
) H
WHERE H.DC_date BETWEEN '2013-03-02' AND '2013-03-11'
ORDER BY `Product_Desc` ASC
LIMIT 510, 30
または、各パーツの条件を複製します。
SELECT *
FROM DCHDR AS H
LEFT JOIN DCDTL AS T ON H.DC_No = T.DC_Nos
WHERE H.DC_date BETWEEN '2013-03-02' AND '2013-03-11'
UNION
SELECT *
FROM DCHDR AS H
RIGHT JOIN DCDTL AS T ON H.DC_No = T.DC_Nos
WHERE H.DC_date BETWEEN '2013-03-02' AND '2013-03-11'
ORDER BY `Product_Desc` ASC
LIMIT 510 , 30
ただし、完全な結合をシミュレートしようとしているようです。代わりに、次のクエリを提案することをお勧めします。これは、はるかに高速である必要があります (実際には、ユニオンの 2 番目の部分をフィルタリングしていない、必要なことを実行します)。
SELECT *
FROM DCHDR AS H
LEFT JOIN DCDTL AS T ON H.DC_No = T.DC_Nos
WHERE H.DC_date BETWEEN '2013-03-02' AND '2013-03-11'
UNION ALL
SELECT *
FROM DCHDR AS H
RIGHT JOIN DCDTL AS T ON H.DC_No = T.DC_Nos
WHERE H.DC_No IS NULL
ORDER BY `Product_Desc` ASC
LIMIT 510 , 30
DCDTL
で意図的に除外しようとしているという点で重複する行がある場合は、をにUNION
変更できますが、実際にはそうではないと思われます。UNION ALL
UNION