鍍金池/ 問答/數據庫/ SQL相同條件 不同查詢內容

SQL相同條件 不同查詢內容

我有一個表,表名:table,欄位A,B,C;
有兩個語句如下:

SELECT SUM(A='a') FROM table WHERE conditon = 'x';
SELECT A,B,C FROM table WHERE conditon = 'x';

因為table的數據量非常大(億級),單獨查詢這兩條語句耗費的時間很大,大概需要4秒,因為這兩個語句的查詢表和條件一模一樣,所以我在想能不能只查一次,然后在通過某種處理,得到這兩個結果?

具體表結構如下

CREATE TABLE "sor"."wpp_adefect_f" (
"glass_id" varchar(30) NOT NULL,
"evt_timestamp" timestamp(6) NOT NULL,
"panel_id" varchar(30) NOT NULL,
"defect_no" int4 NOT NULL,
"real_flg" varchar(1),
"ope_id" varchar(5),
"eqpt_id" varchar(20),
"jge_cnt" varchar(5) NOT NULL,
"unq_seq_id" varchar(25),
"defect_x_coord" varchar(8),
"defect_y_coord" varchar(8),
"data_no" varchar(5),
"gate_no" varchar(5),
"defect_flg" varchar(20),
"scan_slice" varchar(2),
"gray_type" varchar(4),
"defect_size" varchar(1),
"aoi_defect_area_size" varchar(6),
"aoi_defect_x_size" varchar(5),
"aoi_defect_y_size" varchar(5),
"aoi_defect_zone" varchar(1),
"adj_defect_x_size" varchar(5),
"adj_defect_y_size" varchar(5),
"adj_defect_zone" varchar(1),
"defect_area_size" varchar(6),
"defect_x_size" varchar(5),
"defect_y_size" varchar(5),
"defect_zong" varchar(1),
"defect_jge" varchar(2),
"defect_code" varchar(25),
"defect_img" varchar(40),
"dl_flg" varchar(1),
"defect_code_1" varchar(4),
"aoi_mura_jge" varchar(2),
"ibw_vcom_jge" varchar(2),
"aoi_defect_gray_max" varchar(3),
"aoi_defect_gray_min" varchar(3),
"aoi_defect_gray_avg" varchar(3),
"aoi_defect_gray_ref" varchar(3),
"adj_defect_gray_max" varchar(3),
"adj_defect_gray_min" varchar(3),
"adj_defect_gray_avg" varchar(3),
"adj_defect_gray_ref" varchar(3),
"defect_gray_max" varchar(3),
"defect_gray_min" varchar(3),
"defect_gray_avg" varchar(3),
"defect_gray_ref" varchar(3),
"adj_x_mura_val" varchar(4),
"adj_y_vcom_lvl" varchar(4),
"adj_area_size_vcom_val" varchar(5),
"adj_pix_x_coord" varchar(4),
"adj_pix_y_coord" varchar(4),
"measure_val" varchar(4),
"vcom_measure_lvl" varchar(4),
"insp_flg" varchar(9),
"alarm_tst_key_no" varchar(3),
"bef_tape_val" varchar(6),
"after_tape_val" varchar(6),
"aoi_defect_type" varchar(12),
"adj_jge_type" varchar(12),
"defect_rev_ibw_jge_type" varchar(12),
"tape_repair_type" varchar(12),
"ink_repair_type" varchar(12),
"ccd_id" varchar(2),
"aoi_defect_img_name" varchar(40),
"gray_img_name" varchar(40),
"adj_defect_img_name" varchar(40),
"bef_rvrp_img_name" varchar(40),
"aft_rvrp_img_name" varchar(40),
"bef_inrp_img_name" varchar(40),
"aft_inrp_img_name" varchar(40),
"evt_cate" varchar(4),
"evt_user" varchar(20),
"evt_note" varchar(60),
"def_vol_chg" varchar(6),
"line_avg_vol" varchar(6),
"test_def_type_1" varchar(4),
"test_def_type_2" varchar(2),
"rep_res" varchar(2),
"rep_def_code" varchar(4),
"rep_line_flg" varchar(1),
"def_retest_flg" varchar(1),
"def_layer" int4,
"lcvd_rep_time" float8,
"lcvd_length" int4,
"rep_def_type" varchar(12),
"def_img_name" varchar(19),
"analysis_code" varchar(12),
"rank" varchar(2),
"gray_level" varchar(6),
"nd_group" varchar(3),
"repair_line_no" varchar(1),
"pattern_code" varchar(3),
"pattern_name" varchar(20),
"eng_defect_name" varchar(20),
"cel_repair_defect_code" varchar(4),
"cel_repair_eng_defect_code" varchar(20),
"cel_repair_jge_code" varchar(2),
"light_on_block_id" varchar(2),
"defect_spare1" varchar(10),
"defect_spare2" varchar(10),
"cald_date_key_fk" int4,
"shf_key_fk" int4,
"hour_key_fk" int4,
"shop_key_fk" int4,
"prod_key_fk" int4,
"ope_key_fk" int4,
"eqpt_key_fk" int4,
"owner" varchar(4),
"lot_id" varchar(25),
"cald_date" date,
"shf_id" varchar(8),
"hour_id" int4,
"prod_id" varchar(25),
"shop_id" varchar(10),
"glass_type" varchar(5),
"proc_start_time" timestamp(0),
"proc_end_time" timestamp(0),
"pnl_grade" varchar(2),
"operator_id" varchar(12),
"operation_id" varchar(7),
"lcvd_type" varchar(12),
"reserved1" varchar(12),
"reserved2" varchar(12),
"reserved3" varchar(12),
"reserved4" varchar(12),
"etl_timestamp" timestamp(6),
"file_url" varchar(255),
"db_timestamp" timestamp(0) DEFAULT now(),
CONSTRAINT "wpp_adefect_f_pkey" PRIMARY KEY ("glass_id", "evt_timestamp", "panel_id", "defect_no", "jge_cnt")
)
WITH (OIDS=FALSE)
;

ALTER TABLE "sor"."wpp_adefect_f" OWNER TO "sys";



CREATE INDEX "adefect_f_indx1" ON "sor"."wpp_adefect_f" USING btree ("glass_id", "evt_timestamp");

第一條查詢語句為

SELECT
    glass_id,
    evt_timestamp,
    panel_id,
    defect_no,
    jge_cnt,
    real_flg,
    ope_id,
    eqpt_id,
    unq_seq_id,
    defect_x_coord,
    defect_y_coord,
    data_no,
    gate_no,
    defect_flg,
    defect_code,
    defect_size,
    prod_id,
    defect_img,
    operator_id,
    lot_id,
    shop_id,
    (
        CASE
        WHEN SUBSTRING (insp_flg FROM 7 FOR 1) = 'C' THEN
            'B'
        WHEN SUBSTRING (insp_flg FROM 8 FOR 1) = 'T' THEN
            'T'
        WHEN SUBSTRING (insp_flg FROM 1 FOR 6) <> '******' THEN
            'F'
        ELSE
            ' '
        END
    ) FBT_FLG,
    defect_rev_ibw_jge_type,
    aoi_defect_area_size,
    defect_zong,
    defect_x_size,
    defect_y_size,
    aoi_defect_type,
    adj_jge_type,
    gray_img_name,
    aoi_defect_img_name,
    adj_defect_img_name,
    tape_repair_type,
    ink_repair_type,
    ccd_id,
    scan_slice,
    insp_flg,
    adj_defect_gray_max,
    adj_defect_gray_min,
    adj_defect_gray_avg,
    adj_defect_gray_ref,
    adj_x_mura_val,
    adj_y_vcom_lvl,
    adj_area_size_vcom_val,
    adj_defect_x_size,
    adj_defect_y_size,
    adj_defect_zone,
    bef_rvrp_img_name,
    aft_rvrp_img_name,
    bef_inrp_img_name,
    aft_inrp_img_name,
    aoi_defect_gray_max,
    aoi_defect_gray_min,
    aoi_defect_gray_avg,
    aoi_defect_gray_ref,
    ROW_NUMBER () OVER (

        ORDER BY
            lpad(aoi_defect_area_size, 6, '0') DESC,
            panel_id,
            defect_no,
            jge_cnt
    ) AS row_num
FROM
    wpp_adefect_f
WHERE
    1 = 1
AND (
    (
        1 = 1
        AND evt_timestamp = '2018-03-08 14:13:00'
        AND glass_id = 'A183100UAJ'
        AND prod_id = 'A1495A1ANK1'
        AND eqpt_id = 'ILDM06'
        AND ope_id = 'A4311'
        AND jge_cnt = '0'
    )
    OR (
        1 = 1
        AND evt_timestamp = '2018-03-08 14:12:28'
        AND glass_id = 'A1831012CE'
        AND prod_id = 'A1495A1ANK1'
        AND eqpt_id = 'ILDM06'
        AND ope_id = 'A4311'
        AND jge_cnt = '0'
    )
    OR (
        1 = 1
        AND evt_timestamp = '2018-03-08 14:13:35'
        AND glass_id = 'A183700CBK'
        AND prod_id = 'A1495A1ANK1'
        AND eqpt_id = 'IMRV02'
        AND ope_id = 'A1853'
        AND jge_cnt = '0'
    )
    OR (
        1 = 1
        AND evt_timestamp = '2018-03-08 14:13:47'
        AND glass_id = 'A183700CAY'
        AND prod_id = 'A1495A1ANK1'
        AND eqpt_id = 'IMRV02'
        AND ope_id = 'A1853'
        AND jge_cnt = '0'
    )
)
ORDER BY
    lpad(aoi_defect_area_size, 6, '0') DESC,
    panel_id,
    defect_no,
    jge_cnt

第二條查詢語句為

SELECT
    SUM (
        CASE
        WHEN defect_size = 'O'
        AND SUBSTRING (defect_flg FROM 4 FOR 1) <> '1' THEN
            1
        ELSE
            0
        END
    ) AS O,
    SUM (
        CASE
        WHEN defect_size = 'L'
        AND SUBSTRING (defect_flg FROM 4 FOR 1) <> '1' THEN
            1
        ELSE
            0
        END
    ) AS L,
    SUM (
        CASE
        WHEN defect_size = 'S'
        AND SUBSTRING (defect_flg FROM 4 FOR 1) <> '1' THEN
            1
        ELSE
            0
        END
    ) AS S,
    SUM (
        CASE
        WHEN defect_size = 'M'
        AND SUBSTRING (defect_flg FROM 4 FOR 1) <> '1' THEN
            1
        ELSE
            0
        END
    ) AS M,
    SUM (
        CASE
        WHEN SUBSTRING (defect_flg FROM 4 FOR 1) = '1' THEN
            1
        ELSE
            0
        END
    ) AS C
FROM
    wpp_adefect_f
WHERE
    1 = 1
AND (
    (
        1 = 1
        AND evt_timestamp = '2018-03-08 14:13:00'
        AND glass_id = 'A183100UAJ'
        AND prod_id = 'A1495A1ANK1'
        AND eqpt_id = 'ILDM06'
        AND ope_id = 'A4311'
        AND jge_cnt = '0'
    )
    OR (
        1 = 1
        AND evt_timestamp = '2018-03-08 14:12:28'
        AND glass_id = 'A1831012CE'
        AND prod_id = 'A1495A1ANK1'
        AND eqpt_id = 'ILDM06'
        AND ope_id = 'A4311'
        AND jge_cnt = '0'
    )
    OR (
        1 = 1
        AND evt_timestamp = '2018-03-08 14:13:35'
        AND glass_id = 'A183700CBK'
        AND prod_id = 'A1495A1ANK1'
        AND eqpt_id = 'IMRV02'
        AND ope_id = 'A1853'
        AND jge_cnt = '0'
    )
    OR (
        1 = 1
        AND evt_timestamp = '2018-03-08 14:13:47'
        AND glass_id = 'A183700CAY'
        AND prod_id = 'A1495A1ANK1'
        AND eqpt_id = 'IMRV02'
        AND ope_id = 'A1853'
        AND jge_cnt = '0'
    )
)
回答
編輯回答
蔚藍色
--你的想法是既要查出每條數據的詳情、又要求出某個字段的和

--下面是我的思路、你數據庫就只查這一條:

SELECT A,B,C FROM table WHERE conditon = 'x'

--求和的的話能在后臺用它查出的數據、通過循環(huán)方法得到

--但是還是會花上一段時間、只是不用重復寫這兩句SQL了

--如果你sql有 ROLLUP 這個方法那下面的 sql 適用

SELECT 
  
     Id,  --你表的主鍵或者區(qū)分其它數據的列
   
     SUM(CAST(A AS money)) newA ,

     SUM(CAST(B AS money)) newB ,

     SUM(CAST(C AS money)) newC
 
FROM (
        SELECT MONTH(conditon) A,B,C
        FROM [3d_User] d   
        WHERE conditon = 'x'

      ) V  
GROUP BT Id

WITH ROLLUP 

>>詳情點這里<<

方法二:

--這個方法適用于sqlserver,比較簡單
SELECT SUM(A='a'),sum(B='b'),sum(C='c') FROM table WHERE conditon = 'x'

UNION ALL

SELECT A,B,C                            FROM table WHERE conditon = 'x'

--此方法查詢的這三個字段必須一一對應,求出的和會在表的最后一行


2018年9月9日 06:50