Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 从同一个表中提取名称_Sql_Oracle - Fatal编程技术网

Sql 从同一个表中提取名称

Sql 从同一个表中提取名称,sql,oracle,Sql,Oracle,当只有客户映射到名称时,客户列需要名称 Customer# | CustomerName| RepayCustomer#| Loan# 123 | John Doe | 456 | 1 456 | Jane Doe | 456 | 2 123 | John Doe | 123 | 3 预期结果 Customer# | CustomerName| RepayCustomer#

当只有客户映射到名称时,客户列需要名称

Customer# | CustomerName| RepayCustomer#| Loan#
123       | John Doe    | 456           | 1    
456       | Jane Doe    | 456           | 2
123       | John Doe    | 123           | 3
预期结果

Customer# | CustomerName| RepayCustomer#| Loan# | RepayCustomer 
123       | John Doe    | 456           | 1     | Jane Doe
456       | Jane Doe    | 456           | 2     | Jane Doe
123       | John Doe    | 123           | 3     | John Doe    

来自@alexgibbs的答案可以通过使用row_number限制结果来处理他提到的歧义,即存在多个具有相同客户但具有不同客户名称的行。如果有不同的名称,将始终选择按字母顺序排列的第一个名称

SELECT
  CUSTOMER.CUSTOMER#,
  CUSTOMER.CUSTOMERNAME,
  CUSTOMER.REPAYCUSTOMER#,
  CUSTOMER.LOAN#,
  (SELECT RC2.REPAYCUSTOMER FROM
      (SELECT CUSTOMERNAME AS REPAYCUSTOMER,
              ROW_NUMBER() AS SEQUENCE_NUMBER
         FROM CUSTOMER RC
        WHERE RC.CUSTOMER# = CUSTOMER.REPAYCUSTOMER#
        ORDER BY RC.CUSTOMERNAME) RC2
    WHERE RC2.SEQUENCE_NUMBER = 1)
FROM CUSTOMER;

请参见此处,了解为什么不能简单地使用rownum:

假设您的表名为Customer:

SELECT C1.Customer#, C1.CustomerName, C1.RepayCustomer#, C1.Loan#,
C2.CustomerName
FROM Customer C1, (SELECT Customer#, CustomerName
                   FROM CUSTOMER) C2
WHERE C1.RepayCustomer#=C2.Customer#;
假定每个客户都与单个客户名称唯一关联,则生成预期结果所需的全部都是标量子查询

下面是一个例子

首先创建测试表:

CREATE TABLE CUSTOMER(
  CUSTOMER# NUMBER,
  CUSTOMERNAME VARCHAR2(64),
  REPAYCUSTOMER# NUMBER,
  LOAN# NUMBER
);
并加载测试数据:

INSERT INTO CUSTOMER VALUES (123, 'John Doe',456,1);
INSERT INTO CUSTOMER VALUES (456, 'Jane Doe',456,2);
INSERT INTO CUSTOMER VALUES (123, 'John Doe',123,3);
然后运行查询:

SELECT
  CUSTOMER.CUSTOMER#,
  CUSTOMER.CUSTOMERNAME,
  CUSTOMER.REPAYCUSTOMER#,
  CUSTOMER.LOAN#,
  (SELECT DISTINCT REPAYCUSTOMER.CUSTOMERNAME
   FROM CUSTOMER REPAYCUSTOMER
   WHERE REPAYCUSTOMER.CUSTOMER# = CUSTOMER.REPAYCUSTOMER# ) AS REPAYCUSTOMER
FROM CUSTOMER;
结果:

CUSTOMER#  CUSTOMERNAME  REPAYCUSTOMER#  LOAN#  REPAYCUSTOMER  
123        John Doe      456             1      Jane Doe       
456        Jane Doe      456             2      Jane Doe       
123        John Doe      123             3      John Doe 
但是请注意,如果CUSTOMER和CUSTOMERNAME之间的唯一关联存在歧义,例如,如果第一个CUSTOMER 123是John Doe,第二个CUSTOMER 123是WerechewBaca,则此查询将失败,并且应该失败

如果CUSTOMERNAME和CUSTOMER之间的依赖关系为 在这方面,对不同产品的需求得到了缓解


如果可能的话,可能值得考虑提供的表的替代设计。这有助于使这样的获取可靠,并有助于保持数据的完整性以及约束行之间的层次关系

其中哪些是列,哪些是表?它们都是列。我猜customer\u name是customer表中的一列?和/或客户表?我想你问的是你有两张桌子,一张是顾客桌,另一张是顾客桌。您需要对这些表执行联接,并且您想知道如何区分两个表中存在的customer\u name列?不,它们都在同一个表中。客户和客户是两个不同的个体。但是客户也在客户栏中。你能举例说明每栏中的数据类型吗?客户名称是否包含在列中的其他数据中?我认为您可以通过使用行号来解决distinct的问题,当然,您关于整合的观点仍然有效。谢谢大家,它成功了。从Customer.Customer_Number=Psr_Cis和Rownum=1的Customer中选择Distinct Customer.Customer_Name作为Psr_Name,我有很多表加入了如何合并?