3

MYSQL で UNION の WHERE 条件を設定できません。以下の SQL 行では、テーブル内のすべてのレコードを取得しており、2 つの日付の間で日付をフィルタリングしていません。

私の注文は正常に機能しています。ビューを作成せずにこれを行いたい

    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
    WHERE H.DC_date
    BETWEEN '2013-03-02'
    AND '2013-03-11'
    ORDER BY `Product_Desc` ASC
    LIMIT 510 , 30
4

3 に答える 3

5

とは異なり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 ALLUNION

于 2013-03-11T07:02:35.877 に答える
3

それをサブクエリの中に入れて、外側のクエリでフィルタリングを行ってみてください:

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
) AS sub
WHERE DC_date BETWEEN '2013-03-02'
                  AND '2013-03-11'
ORDER BY `Product_Desc` ASC;
LIMIT 510 , 30
于 2013-03-11T07:02:27.547 に答える
0

あなたの を見てみましょうUNION。これは次の 2 つの部分で構成されています。

SELECT *
FROM DCHDR AS H
LEFT JOIN DCDTL AS T ON H.DC_No = T.DC_Nos

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'

a の条件UNIONは後半に適用されます。INNER JOIN左側の部分の列に条件があるため、2 番目の部分は単なるです。また、UNION重複する行を削除するため、全体的なクエリは最初のLEFT JOIN.

于 2013-03-11T07:36:29.457 に答える