0

2つのテーブルですべてユニオンを実行した後、WHEREステートメントの@Badgeパラメーターを無視します。コードは以下のとおりです。

SELECT     TOP (100) PERCENT ID_BADGE, LEFT(RIGHT('000000' + CAST(TIME_TRX AS varchar), 6), 2) 
                      + ':' + SUBSTRING(LEFT(RIGHT('000000' + CAST(TIME_TRX AS varchar), 6), 4), 3, 2) AS ClockTime, DATE_TRX, CODE_TRX

FROM omi.DCUTRX_ZERO 

UNION ALL 

SELECT     TOP (100) PERCENT ID_BADGE, LEFT(RIGHT('000000' + CAST(TIME_TRX AS varchar), 6), 2) 
                      + ':' + SUBSTRING(LEFT(RIGHT('000000' + CAST(TIME_TRX AS varchar), 6), 4), 3, 2) AS ClockTime, DATE_TRX, CODE_TRX
FROM omi.TAHIST_ZERO 

WHERE     (ID_BADGE = '     ' + @Badge)  AND (DATE_TRX BETWEEN @Date AND @Date2) AND (SEQ_REC IN ('0', '1000')) AND (CODE_TRX IN ('100', '101'))

どんな助けでも大歓迎です!

4

3 に答える 3

3

WHEREを両方に適用する場合は、ステートメントをラップして、次のように結果のセットに適用する必要があります。

SELECT *
FROM (
    SELECT TOP (100) PERCENT ID_BADGE,
        LEFT(RIGHT('000000' + CAST(TIME_TRX AS varchar), 6), 2) + ':' + SUBSTRING(LEFT(RIGHT('000000' + CAST(TIME_TRX AS varchar), 6), 4), 3, 2) AS ClockTime,
        DATE_TRX,
        CODE_TRX
    FROM omi.DCUTRX_ZERO 
    UNION ALL 
    SELECT TOP (100) PERCENT ID_BADGE,
        LEFT(RIGHT('000000' + CAST(TIME_TRX AS varchar), 6), 2) + ':' + SUBSTRING(LEFT(RIGHT('000000' + CAST(TIME_TRX AS varchar), 6), 4), 3, 2) AS ClockTime,
        DATE_TRX,
        CODE_TRX
    FROM omi.TAHIST_ZERO
) q
WHERE (ID_BADGE = '     ' + @Badge)  AND
    (DATE_TRX BETWEEN @Date AND @Date2) AND
    (SEQ_REC IN ('0', '1000')) AND
    (CODE_TRX IN ('100', '101'))
于 2012-12-27T14:40:07.600 に答える
2

WHERE句をすべての結果に適用する場合は、次のことを試してください。

select * from (
SELECT TOP (100) PERCENT 
    ID_BADGE, 
    LEFT(RIGHT('000000' + CAST(TIME_TRX AS varchar), 6), 2) + ':' + SUBSTRING(LEFT(RIGHT('000000' + CAST(TIME_TRX AS varchar), 6), 4), 3, 2) AS ClockTime, 
    DATE_TRX, 
    CODE_TRX
FROM omi.DCUTRX_ZERO 

UNION ALL 

SELECT TOP (100) PERCENT 
    ID_BADGE, 
    LEFT(RIGHT('000000' + CAST(TIME_TRX AS varchar), 6), 2) + ':' + SUBSTRING(LEFT(RIGHT('000000' + CAST(TIME_TRX AS varchar), 6), 4), 3, 2) AS ClockTime, 
    DATE_TRX, 
    CODE_TRX
FROM omi.TAHIST_ZERO 
) omi
WHERE (omi.ID_BADGE = '     ' + @Badge)  
    AND (omi.DATE_TRX BETWEEN @Date AND @Date2) 
    AND (omi.SEQ_REC IN ('0', '1000')) 
    AND (omi.CODE_TRX IN ('100', '101'))
于 2012-12-27T14:40:45.283 に答える
1

WHEREフィルターは最後のUNIONSELECTに適用されます。

次のようにSQLを改善します。

SELECT     TOP (100) PERCENT ID_BADGE, LEFT(RIGHT('000000' + CAST(TIME_TRX AS varchar), 6), 2) 
+ ':' + SUBSTRING(LEFT(RIGHT('000000' + CAST(TIME_TRX AS varchar), 6), 4), 3, 2) AS ClockTime, DATE_TRX, CODE_TRX
FROM omi.DCUTRX_ZERO 
WHERE     (ID_BADGE = '     ' + @Badge)  AND (DATE_TRX BETWEEN @Date AND @Date2) AND (SEQ_REC IN ('0', '1000')) AND (CODE_TRX IN ('100', '101'))

UNION ALL 

SELECT     TOP (100) PERCENT ID_BADGE, LEFT(RIGHT('000000' + CAST(TIME_TRX AS varchar), 6), 2) 
                  + ':' + SUBSTRING(LEFT(RIGHT('000000' + CAST(TIME_TRX AS varchar), 6), 4), 3, 2) AS ClockTime, DATE_TRX, CODE_TRX
FROM omi.TAHIST_ZERO
WHERE     (ID_BADGE = '     ' + @Badge)  AND (DATE_TRX BETWEEN @Date AND @Date2) AND (SEQ_REC IN ('0', '1000')) AND (CODE_TRX IN ('100', '101'))
于 2012-12-27T15:27:27.220 に答える