2

COALESCE 構文で構成されるクエリがあります。COALESCE 構文は、ファイルの監査日を見つけるだけです。WHERE ステートメントで、Audited File ベースをエイリアス フィールドから出力したいだけですが、うまくいきAuditDateません。これが私のクエリです。

SELECT COALESCE(qua.starttime, prd.starttime) AS `AuditDate`,
       prd.employeeno AS `EmployeeNo`,
       prd.starttime AS `StartTime`,
       prd.endtime AS `EndTime`
  FROM production prd
  LEFT JOIN qualityaudit qua
    ON prd.id=qua.id
 WHERE `AuditDate` BETWEEN '2011-10-01 00:00:00' AND '2011-10-01 23:59:59';

このクエリを正しく取得するにはどうすればよいですか?

4

4 に答える 4

3

クエリは次のようにする必要があります

SELECT COALESCE(qua.starttime, prd.starttime) AS `AuditDate`,
       prd.employeeno AS `EmployeeNo`,
       prd.starttime AS `StartTime`,
       prd.endtime AS `EndTime`
  FROM production prd
  LEFT JOIN qualityaudit qua
    ON prd.id=qua.id
 WHERE COALESCE(qua.starttime, prd.starttime) BETWEEN '2011-10-01 00:00:00' AND '2011-10-01 23:59:59';

あなたの状況では、関数の結果から得られたエイリアスをWHERE句のクエリ基準として使用することはできません(http://dev.mysql.com/doc/refman/5.0/en/problems-with-alias.htmlを参照してください)。ただし、エイリアスを使用して in 句を検索できますHAVING。MySQL 5.0.2HAVING以降では、SELECT リストまたは外部サブクエリの select_expr で指定された任意のカラムまたはエイリアスを参照し、次のような関数を集約することが許可されているためです。

SELECT COALESCE(qua.starttime, prd.starttime) AS `AuditDate`,
       prd.employeeno AS `EmployeeNo`,
       prd.starttime AS `StartTime`,
       prd.endtime AS `EndTime`
  FROM production prd
  LEFT JOIN qualityaudit qua
    ON prd.id=qua.id
 HAVING `AuditDate` BETWEEN '2011-10-01 00:00:00' AND '2011-10-01 23:59:59';

どちらも同じ結果

于 2011-10-10T11:33:30.370 に答える
2

使用する

SELECT COALESCE(qua.starttime, prd.starttime) AS `AuditDate`,
       prd.employeeno AS `EmployeeNo`,
       prd.starttime AS `StartTime`,
       prd.endtime AS `EndTime`
  FROM production prd
  LEFT JOIN qualityaudit qua
    ON prd.id=qua.id
 WHERE COALESCE(qua.starttime, prd.starttime) BETWEEN '2011-10-01 00:00:00' AND '2011-10-01 23:59:59';

上記は、日付形式/列タイプが実際に一致していることを前提としています...

于 2011-10-10T11:33:01.430 に答える
2

他の人が指摘しているように、エイリアスを使用することはできません。合体を 2 回呼び出すのを避けるために、HAVING ステートメントを使用できます。

SELECT COALESCE(qua.starttime, prd.starttime) AS `AuditDate`,
       prd.employeeno AS `EmployeeNo`,
       prd.starttime AS `StartTime`,
       prd.endtime AS `EndTime`
  FROM production prd
  LEFT JOIN qualityaudit qua
    ON prd.id=qua.id
HAVING `AuditDate` BETWEEN '2011-10-01 00:00:00' AND '2011-10-01 23:59:59';
于 2011-10-10T11:35:51.903 に答える
1

句のSELECTリストからエイリアスを使用することはできません。WHERE

これを使って:

SELECT *
FROM
  ( SELECT COALESCE(qua.starttime, prd.starttime) AS `AuditDate`,
           prd.employeeno AS `EmployeeNo`,
           prd.starttime AS `StartTime`,
           prd.endtime AS `EndTime`
      FROM production prd
      LEFT JOIN qualityaudit qua
        ON prd.id=qua.id
  ) AS tmp
WHERE `AuditDate` BETWEEN '2011-10-01 00:00:00' AND '2011-10-01 23:59:59';

またはコードを複製します。

SELECT COALESCE(qua.starttime, prd.starttime) AS `AuditDate`,
       prd.employeeno AS `EmployeeNo`,
       prd.starttime AS `StartTime`,
       prd.endtime AS `EndTime`
  FROM production prd
  LEFT JOIN qualityaudit qua
    ON prd.id=qua.id
 WHERE COALESCE(qua.starttime, prd.starttime) 
         BETWEEN '2011-10-01 00:00:00' AND '2011-10-01 23:59:59';
于 2011-10-10T11:33:53.380 に答える