oracle 我正在尝试为2个表创建删除查询

jv2fixgn  于 2023-04-20  发布在  Oracle
关注(0)|答案(2)|浏览(131)

我试图设计一个查询,以消除重复的2表,这些是CDUCUSTOMER和CDUINVOICE。主键是ID。这个问题还要求确保查询删除重复的数据
设计一个删除查询,它将消除客户列IDCustomerLastNameCustomerFirstName和发票列Invoice_DateInvoice_No的重复数据。◦确保查询删除所有重复数据。
我试过这个

SELECT ID, CUSTOMERLASTNAME, CUSTOMERFIRSTNAME, INVOICE__DATE, INVOICE_NO
FROM CDUCUSTOMER, CDUINVOICE
    (
  SELECT ID, CUSTOMERLASTNAME, CUSTOMERFIRSTNAME, INVOICE__DATE, INVOICE_NO
  FROM CDUCUSTOMER
  UNION
  SELECT ID, CUSTOMERLASTNAME, CUSTOMERFIRSTNAME, INVOICE__DATE, INVOICE_NO
  FROM CDUINVOICE
) TEMP
    WHERE TEMP.ID NOT IN (
    SELECT MIN(ID)
    FROM (
    SELECT ID, CUSTOMERLASTNAME, CUSTOMERFIRTSNAME, INVOICE__DATE, INVOICE_NO
    FROM CDUCUSTOMER
    UNION
    SELECT ID, CUSTOMERLASTNAME, CUSTOMERFIRSTNAME, INVOICE__DATE, INVOICE_NO
    FROM CDUinvoice
  ) TEMP2
  GROUP BY ID, CUSTOMERLASTNAME, CUSTOMERFIRTSNAME, INVOICE__DATE, INVOICE_NO
);

我得到一个错误

sql error ora-01789: query block has incorrect number of result columns
6psbrbz9

6psbrbz91#

您的查询似乎使用了一个名为CDUINVOICE的函数,但从3开始的每一行都被传递为参数,或者原始查询的第2行应该只是FROM,例如。

SELECT ID, CUSTOMERLASTNAME, CUSTOMERFIRSTNAME, INVOICE__DATE, INVOICE_NO
FROM (
  SELECT ID, CUSTOMERLASTNAME, CUSTOMERFIRSTNAME, INVOICE__DATE, INVOICE_NO
  FROM CDUCUSTOMER
  UNION
  SELECT ID, CUSTOMERLASTNAME, CUSTOMERFIRSTNAME, INVOICE__DATE, INVOICE_NO
  FROM CDUINVOICE
) TEMP
    WHERE TEMP.ID NOT IN (
    SELECT MIN(ID)
    FROM (
    SELECT ID, CUSTOMERLASTNAME, CUSTOMERFIRTSNAME, INVOICE__DATE, INVOICE_NO
    FROM CDUCUSTOMER
    UNION
    SELECT ID, CUSTOMERLASTNAME, CUSTOMERFIRSTNAME, INVOICE__DATE, INVOICE_NO
    FROM CDUinvoice
  ) TEMP2
  GROUP BY ID, CUSTOMERLASTNAME, CUSTOMERFIRTSNAME, INVOICE__DATE, INVOICE_NO
);
vc6uscn9

vc6uscn92#

如果我理解正确的话,您希望从两个表中删除重复的行。
如果是这样,关于你得到的错误代码(ORA-01789),它说你使用Oracle,那么:不能使用同一查询从两个表中删除行。
我不知道你写这段代码是什么意思。这里应该有一个逗号:

FROM CDUCUSTOMER, CDUINVOICE         <-- here
    (
  SELECT ID,

你得到的错误提示有UNION(是的,有两个),但是SELECT语句返回了不同的列数。这是不正确的,至少从你发布的代码来看不是这样-所有选择返回5列,所以-关于真实的的错误(缺少逗号)和Oracle提出的错误,我怀疑你可能没有发布你实际运行的查询。
我们使用的一种删除重复项的方法是(一次一个表):

delete from cducustomer a
where a.rowid > (select min(b.rowid)
                 from cducustomer b
                 where a.id = b.id
                   and a.customerlastname = b.customerlastname
                   and a.customerfirstname = b.customerfirstname
                );

(you我会对另一个表做同样的事情,在invoice_dateinvoice_no列上执行连接)。
如果这不是你想要的,你能发布一些示例数据来说明问题吗?源数据(显示你现在有什么)和期望的结果(沿着为什么会发生这种情况的解释)。

相关问题