错误:用作表达式的子查询返回的多行

时间:2012-01-17 19:49:22

标签: bash postgresql subquery expression

我已搜索并搜索过..我有一个bash脚本,用于运行psql查询并每天通过电子邮件发送结果。数据库不会更新到午夜,我的bash脚本会将变量传递给前一天的查询。我只有在使用传递的变量时才会收到此错误,否则如果我手动将日期放入查询中就可以正常运行。不太确定我还在学习psql和bash。

这是bash脚本:

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

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@anotheremail.com $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 个答案:

答案 0 :(得分:3)

当使用SELECT部分​​中的子查询(例如,(SELECT a, b, (SELECT c from d ...))查询时,必须返回一个值。返回错误,因为子查询返回多行。检查所有子查询以确保这些子查询不返回多行。如果可以接受存在多个值,则添加LIMIT 1子句,但只有一个值。