2012-01-17 3 views
0

Я искал и искал. У меня есть сценарий bash, который используется для запуска запроса psql и отправки результатов по электронной почте ежедневно. БД не обновляется до полуночи, и мой сценарий bash передает переменную в запрос за день до этого. Я получаю эту ошибку только тогда, когда я использую переданную переменную, иначе, если я поместил дату в запрос вручную, она будет работать нормально. Не совсем уверен, что я все еще изучаю psql и bash.ОШИБКА: более одной строки, возвращаемой подзапросом, используемым как выражение

Вот Баш скрипт:

#!/bin/bash 
NOWDATE=`date +%Y-%m-%d -d "yesterday"` 
SUBDATE=`date '+%B %e, %G'` 
DIR=/file/report/ 
FILE=file-$NOWDATE.csv 
[email protected] 

PGPASSWORD=passwrod psql -w -h host -p 5432 -d database -U user -o $DIR/$FILE <<EOF 
select distinct als."Table_AccountID", 
    (select "Table_val_AccountStatusID" from "Table_log_AccountStatus" 
    where "Table_AccountID" = als."Table_AccountID" order by "Date" desc limit 1) 
    as "Table_val_AccountStatusID", 

    CASE 
    when (select count(*) from "Table_UsageHistory" cfuh 
     where cfuh."Disk">'123456' and date_trunc('day',cfuh."Created") = date_trunc('day','$NOWDATE'::timestamp) 
     -- -'1day':: interval 
     and extrTable('day' from "Created"::timestamp) = ac."DesiredBillingDate" 
     and date_trunc('day', "Created"::timestamp) = date_trunc('day', '$NOWDATE'::timestamp) 
     and cfuh."Table_AccountID" in (
      select distinct "Table_AccountID" from "Table_Usage" 
      where date_trunc('day', "Timestamp"::timestamp) = date_trunc('day','$NOWDATE'::timestamp) 
      and "Table_AccountID" = cfuh."Table_AccountID") 
     and cfuh."Table_AccountID" = als."Table_AccountID") >0 
    then 'Y' 
    else 'N' 
    end as "RollUp", 

    (select distinct bc."ID" from "BIL_BillableCharge" bc, "Table_UsageHistory" cfh 
    where date_trunc('day',bc."Date"::timestamp) = date_trunc('day',cfh."Created"::timestamp) 
    and bc."Table_AccountID" = cfh."Table_AccountID" and bc."BIL_val_InvoiceItemTypeID" = '23' 
    and extrTable('month' from "Created"::timestamp) = extrTable('month' from '$NOWDATE'::timestamp) 
    and extrTable('year' from "Created"::timestamp) = extrTable('year' from '$NOWDATE'::timestamp) 
    and cfh."Table_AccountID" = als."Table_AccountID") as "BillableChargeID" 

    from "Table_log_AccountStatus" als, "Table_Account" ac 
    group by als."Table_AccountID", ac."ID", ac."DesiredBillingDate" 
    having (select distinct "Disk" from "Table_UsageHistory" cfu 
    where date_trunc('day', cfu."Created") = date_trunc('day','$NOWDATE'::timestamp) 
    and ac."ID" = cfu."Table_AccountID")>'123456' 
    and extrTable('day' from '$NOWDATE'::timestamp) = ac."DesiredBillingDate" 
    and ac."ID" = als."Table_AccountID" 
    ORDER BY "RollUp" ASC 
EOF 

sed -i '2d' $DIR/$FILE | 
    mailx -a $DIR/$FILE -s " Report for $SUBDATE" -r [email protected] $RECIPIENT 

Вот SQL, переформатировать для удобства чтения.

select distinct 
    als."Table_AccountID", 

    (select "Table_val_AccountStatusID" 
    from "Table_log_AccountStatus" 
    where "Table_AccountID" = als."Table_AccountID" 
    order by "Date" desc limit 1) as "Table_val_AccountStatusID", 

    CASE when 
     (select count(*) 
     from "Table_UsageHistory" cfuh 
     where cfuh."Disk">'123456' 
      and date_trunc('day',cfuh."Created") = date_trunc('day','$NOWDATE'::timestamp) -- -'1day':: interval 
      and extrTable('day' from "Created"::timestamp) = ac."DesiredBillingDate" 
      and date_trunc('day', "Created"::timestamp) = date_trunc('day', '$NOWDATE'::timestamp) 
      and cfuh."Table_AccountID" in 
       (select distinct "Table_AccountID" 
       from "Table_Usage" 
       where date_trunc('day', "Timestamp"::timestamp) = date_trunc('day','$NOWDATE'::timestamp) 
       and "Table_AccountID" = cfuh."Table_AccountID") 
       and cfuh."Table_AccountID" = als."Table_AccountID") > 0 
     then 'Y' 
     else 'N' 
    end as "RollUp", 

    (select distinct bc."ID" 
    from "BIL_BillableCharge" bc, "Table_UsageHistory" cfh 
    where date_trunc('day',bc."Date"::timestamp) = date_trunc('day',cfh."Created"::timestamp) 
    and bc."Table_AccountID" = cfh."Table_AccountID" and bc."BIL_val_InvoiceItemTypeID" = '23' 
    and extrTable('month' from "Created"::timestamp) = extrTable('month' from '$NOWDATE'::timestamp) 
    and extrTable('year' from "Created"::timestamp) = extrTable('year' from '$NOWDATE'::timestamp) 
    and cfh."Table_AccountID" = als."Table_AccountID") as "BillableChargeID" 

from "Table_log_AccountStatus" als, "Table_Account" ac 
group by als."Table_AccountID", ac."ID", ac."DesiredBillingDate" 
having (select distinct "Disk" 
     from "Table_UsageHistory" cfu 
     where date_trunc('day', cfu."Created") = date_trunc('day','$NOWDATE'::timestamp) 
      and ac."ID" = cfu."Table_AccountID")>'123456' 
    and extrTable('day' from '$NOWDATE'::timestamp) = ac."DesiredBillingDate" 
    and ac."ID" = als."Table_AccountID" 
ORDER BY "RollUp" ASC 

Когда бежал так же, как это из командной строки на сервере он выплевывает ошибку: ОШИБКИ: более одной строки, возвращаемой подзапрос используется как выражение

Я высоко ценю помощь, это сообщество является лучшим .. Извините за форматирование, оно произошло из копии.

+1

Что заставляет вас думать, что 'select different bc. 'ID' from" BIL_BillableCharge "bc, ...' приведет к точно одному значению? Возможно, вы захотите также переключиться на явные условия JOIN. –

+0

Ваша арифметика даты закомментирована. Это часть проблемы? –

+1

@muistooshort: Я думаю, что единственный другой подзапрос, который может не возвращать одиночные значения, это 'select different 'Disk" ... '. –

ответ

3

Когда используется подзапрос в части SELECT, например (SELECT a, b, (SELECT c from d ...)) запроса, он должен возвращать значение один из значений. Ошибка возвращается, потому что один из подзапросов возвращает более одного ряда. Проверьте все подзапросы, чтобы они не возвращали более одной строки. Добавьте предложение LIMIT 1, если допустимо, что существует более одного значения, но принимается только одно.

+0

Есть ли способ добавить «более одной строки» к другому запросу? – precose

Смежные вопросы

 Смежные вопросы