Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.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_Sql Server_Sql Server 2012 - Fatal编程技术网

Sql 在同一选择中查找全名

Sql 在同一选择中查找全名,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,如何根据PERSON\u T2获取列FULLNAME\u T2的正确全名 列FULLNAME\u T2的信息错误。基于PERSON\u T2,我应该有正确的全名,如果NULL也应该是NULL。PERSON\u T1和FULLNAME\u T1正常 MS SQL Server 2012架构设置: CREATE TABLE Table1 ( number varchar(10), person varchar(20), dept varchar(20),

如何根据
PERSON\u T2
获取列
FULLNAME\u T2
的正确全名

FULLNAME\u T2
的信息错误。基于
PERSON\u T2
,我应该有正确的全名,如果
NULL
也应该是
NULL
PERSON\u T1
FULLNAME\u T1
正常

MS SQL Server 2012架构设置

CREATE TABLE Table1 
    (
     number varchar(10), 
     person varchar(20),
     dept varchar(20),
     status varchar(10)
    );

CREATE TABLE Table2 
    (
     number varchar(10), 
     person varchar(20),
     dept varchar(20),
     status varchar(10)
    );

CREATE TABLE Table3
    (
     fullname varchar(100), 
     person varchar(20),
    );


INSERT INTO Table1
(number, person, dept, status)
VALUES
('100', 'john.mayer', 'A', 'ready'),
('101', 'ana.phil', 'A', 'ready'),
('102', 'andre.muss', 'A', 'ready'),
('103', 'dani.lovato', 'A', 'ready'),
('104', 'paul.simons', 'A', 'ready'),
('105', 'carla.almeida', 'A', 'ready');

INSERT INTO Table2
(number, person, dept, status)
VALUES
('100', 'philip.ann', 'A', 'ready'),
('101', 'duna.andrea', 'A', 'ready'),
('102', 'robert.deniro', 'A', 'ready'),
('103', NULL, 'A', 'ready'),
('104', NULL, 'A', 'ready'),
('105', NULL, 'A', 'ready');

INSERT INTO Table3
(fullname, person)
VALUES
('John Antoni Mayer', 'john.mayer'),
('Ana Phil', 'ana.phil'),
('Andre Marc Muss', 'andre.muss'),
('Dani Mc Lovato', 'dani.lovato'),
('Paul Simons', 'paul.simons'),
('Carla Andrade Almeira', 'carla.almeida'),
('Philip Ann', 'philip.ann'),
('Duna Andrea', 'duna.andrea'),
('Robert Deniro', 'robert.deniro');
SELECT
    Table1.number AS Number,
    Table1.person AS Person_T1,
    Table3.fullname AS FullName_T1,
    Table2.person AS Person_T2,
    Table3.fullname AS FullName_T2
FROM
    Table1,
    Table2,
    Table3
WHERE
    Table1.number = Table2.number
AND Table1.person = Table3.person
AND Table1.dept = 'A'
AND Table1.status = 'ready'
| NUMBER |     PERSON_T1 |           FULLNAME_T1 |     PERSON_T2 |           FULLNAME_T2 |
|--------|---------------|-----------------------|---------------|-----------------------|
|    100 |    john.mayer |     John Antoni Mayer |    philip.ann |     John Antoni Mayer |
|    101 |      ana.phil |              Ana Phil |   duna.andrea |              Ana Phil |
|    102 |    andre.muss |       Andre Marc Muss | robert.deniro |       Andre Marc Muss |
|    103 |   dani.lovato |        Dani Mc Lovato |        (null) |        Dani Mc Lovato |
|    104 |   paul.simons |           Paul Simons |        (null) |           Paul Simons |
|    105 | carla.almeida | Carla Andrade Almeira |        (null) | Carla Andrade Almeira |
查询1

CREATE TABLE Table1 
    (
     number varchar(10), 
     person varchar(20),
     dept varchar(20),
     status varchar(10)
    );

CREATE TABLE Table2 
    (
     number varchar(10), 
     person varchar(20),
     dept varchar(20),
     status varchar(10)
    );

CREATE TABLE Table3
    (
     fullname varchar(100), 
     person varchar(20),
    );


INSERT INTO Table1
(number, person, dept, status)
VALUES
('100', 'john.mayer', 'A', 'ready'),
('101', 'ana.phil', 'A', 'ready'),
('102', 'andre.muss', 'A', 'ready'),
('103', 'dani.lovato', 'A', 'ready'),
('104', 'paul.simons', 'A', 'ready'),
('105', 'carla.almeida', 'A', 'ready');

INSERT INTO Table2
(number, person, dept, status)
VALUES
('100', 'philip.ann', 'A', 'ready'),
('101', 'duna.andrea', 'A', 'ready'),
('102', 'robert.deniro', 'A', 'ready'),
('103', NULL, 'A', 'ready'),
('104', NULL, 'A', 'ready'),
('105', NULL, 'A', 'ready');

INSERT INTO Table3
(fullname, person)
VALUES
('John Antoni Mayer', 'john.mayer'),
('Ana Phil', 'ana.phil'),
('Andre Marc Muss', 'andre.muss'),
('Dani Mc Lovato', 'dani.lovato'),
('Paul Simons', 'paul.simons'),
('Carla Andrade Almeira', 'carla.almeida'),
('Philip Ann', 'philip.ann'),
('Duna Andrea', 'duna.andrea'),
('Robert Deniro', 'robert.deniro');
SELECT
    Table1.number AS Number,
    Table1.person AS Person_T1,
    Table3.fullname AS FullName_T1,
    Table2.person AS Person_T2,
    Table3.fullname AS FullName_T2
FROM
    Table1,
    Table2,
    Table3
WHERE
    Table1.number = Table2.number
AND Table1.person = Table3.person
AND Table1.dept = 'A'
AND Table1.status = 'ready'
| NUMBER |     PERSON_T1 |           FULLNAME_T1 |     PERSON_T2 |           FULLNAME_T2 |
|--------|---------------|-----------------------|---------------|-----------------------|
|    100 |    john.mayer |     John Antoni Mayer |    philip.ann |     John Antoni Mayer |
|    101 |      ana.phil |              Ana Phil |   duna.andrea |              Ana Phil |
|    102 |    andre.muss |       Andre Marc Muss | robert.deniro |       Andre Marc Muss |
|    103 |   dani.lovato |        Dani Mc Lovato |        (null) |        Dani Mc Lovato |
|    104 |   paul.simons |           Paul Simons |        (null) |           Paul Simons |
|    105 | carla.almeida | Carla Andrade Almeira |        (null) | Carla Andrade Almeira |

CREATE TABLE Table1 
    (
     number varchar(10), 
     person varchar(20),
     dept varchar(20),
     status varchar(10)
    );

CREATE TABLE Table2 
    (
     number varchar(10), 
     person varchar(20),
     dept varchar(20),
     status varchar(10)
    );

CREATE TABLE Table3
    (
     fullname varchar(100), 
     person varchar(20),
    );


INSERT INTO Table1
(number, person, dept, status)
VALUES
('100', 'john.mayer', 'A', 'ready'),
('101', 'ana.phil', 'A', 'ready'),
('102', 'andre.muss', 'A', 'ready'),
('103', 'dani.lovato', 'A', 'ready'),
('104', 'paul.simons', 'A', 'ready'),
('105', 'carla.almeida', 'A', 'ready');

INSERT INTO Table2
(number, person, dept, status)
VALUES
('100', 'philip.ann', 'A', 'ready'),
('101', 'duna.andrea', 'A', 'ready'),
('102', 'robert.deniro', 'A', 'ready'),
('103', NULL, 'A', 'ready'),
('104', NULL, 'A', 'ready'),
('105', NULL, 'A', 'ready');

INSERT INTO Table3
(fullname, person)
VALUES
('John Antoni Mayer', 'john.mayer'),
('Ana Phil', 'ana.phil'),
('Andre Marc Muss', 'andre.muss'),
('Dani Mc Lovato', 'dani.lovato'),
('Paul Simons', 'paul.simons'),
('Carla Andrade Almeira', 'carla.almeida'),
('Philip Ann', 'philip.ann'),
('Duna Andrea', 'duna.andrea'),
('Robert Deniro', 'robert.deniro');
SELECT
    Table1.number AS Number,
    Table1.person AS Person_T1,
    Table3.fullname AS FullName_T1,
    Table2.person AS Person_T2,
    Table3.fullname AS FullName_T2
FROM
    Table1,
    Table2,
    Table3
WHERE
    Table1.number = Table2.number
AND Table1.person = Table3.person
AND Table1.dept = 'A'
AND Table1.status = 'ready'
| NUMBER |     PERSON_T1 |           FULLNAME_T1 |     PERSON_T2 |           FULLNAME_T2 |
|--------|---------------|-----------------------|---------------|-----------------------|
|    100 |    john.mayer |     John Antoni Mayer |    philip.ann |     John Antoni Mayer |
|    101 |      ana.phil |              Ana Phil |   duna.andrea |              Ana Phil |
|    102 |    andre.muss |       Andre Marc Muss | robert.deniro |       Andre Marc Muss |
|    103 |   dani.lovato |        Dani Mc Lovato |        (null) |        Dani Mc Lovato |
|    104 |   paul.simons |           Paul Simons |        (null) |           Paul Simons |
|    105 | carla.almeida | Carla Andrade Almeira |        (null) | Carla Andrade Almeira |

使用Fiddle链接,将要在
表2
上联接的查询更改为
表3
而不是
表1
,并使其
左外联接
而不是
联接
,得到明显的所需结果。(修改链接)

SQL查询

SELECT Table1.number AS Number,
       Table1.person AS Person_T1,
       Table3.fullname AS FullName_T1,
       Table2.person AS Person_T2,
       Table3.fullname AS FullName_T2
  FROM Table1
         left outer join -- Change this to simple joins to make it exclusive
       Table2 on Table1.number = Table2.number
         left outer join -- Change this to simple joins to make it exclusive
       Table3 on Table2.person = Table3.person -- Difference is here
 WHERE Table1.dept = 'A'
   AND Table1.status = 'ready'
输出

NUMBER PERSON_T1 FULLNAME_T1 PERSON_T2 FULLNAME_T2 100 john.mayer Philip Ann philip.ann Philip Ann 101 ana.phil Duna Andrea duna.andrea Duna Andrea 102 andre.muss Robert Deniro robert.deniro Robert Deniro 103 dani.lovato (null) (null) (null) 104 paul.simons (null) (null) (null) 105 carla.almeida (null) (null) (null) 数字人物全名人物全名 约翰·梅耶·菲利普·安·菲利普·安 101安娜·菲尔·杜纳安德里亚·杜纳安德里亚·杜纳安德里亚 102安德烈·穆斯·罗伯特·德尼罗·罗伯特·德尼罗·罗伯特·德尼罗 103 dani.lovato(空)(空)(空) 104保罗·西蒙斯(空)(空)(空) 105卡拉·阿尔梅达(空)(空)(空)
关于

的更多信息据我所知,您希望从表3中进行选择,并从表1或表2中获取匹配的记录

SELECT
  t1.number AS Number,
  t1.person AS Person_T1,
  t3.fullname AS FullName_T1,
  t2.person AS Person_T2,
  t3.fullname AS FullName_T2
FROM t3 t3
left join t1 t1 on t1.person = t3.person
left join t2 t2 on t2.person = t3.person
where t1.status = 'ready';

如果您想要表1或表2中的值,请使用coalesce:
coalesce(t1.number,t2.number)作为number

,您只需要第二次引用
Table3
,但使用不同的连接谓词(引用
table2
,而不是
table1
)。由于您有
NULL
值,因此需要一个
OUTER
连接:

SELECT  t1.number AS Number,
        t1.person AS Person_T1,
        t3.fullname AS FullName_T1,
        t2.person AS Person_T2,
        t4.fullname AS FullName_T2
FROM    Table1 AS t1
        INNER JOIN Table2 AS t2
            ON t1.Number = t2.Number
        INNER JOIN Table3 AS t3
            ON t3.Person = t1.Person
        LEFT JOIN Table3 AS t4
            ON t4.Person = t2.Person
WHERE   t1.dept = 'A'
AND     t1.status = 'ready';
这使得:

| NUMBER |     PERSON_T1 |           FULLNAME_T1 |     PERSON_T2 |           FULLNAME_T2 |
|--------|---------------|-----------------------|---------------|-----------------------|
|    100 |    john.mayer |     John Antoni Mayer |    philip.ann |            Philip Ann |
|    101 |      ana.phil |              Ana Phil |   duna.andrea |           Duna Andrea |
|    102 |    andre.muss |       Andre Marc Muss | robert.deniro |         Robert Deniro |
|    103 |   dani.lovato |        Dani Mc Lovato |        (null) |                (null) |
|    104 |   paul.simons |           Paul Simons |        (null) |                (null) |
|    105 | carla.almeida | Carla Andrade Almeira |        (null) |                (null) |

注意:我已将您的联接从ANSI-89联接语法切换到较新的ANSI-92联接语法。Aaron Bertrand已经写了一篇文章,其中有许多令人信服的理由需要转换。

本文提供的细节非常出色,因为它提供了完整的DDL、示例数据和到SQL FIDLE的链接,但是它似乎缺少了一个非常重要的组成部分。。。。一个问题?谢谢@GarethD。问题是:列FULLNAME_T2包含错误的信息[根据PERSON_T2,它应该具有正确的名称]。这更像是一种陈述!另外,您确实希望使用ANSI标准联接,而不是一堆WHERE语句。只是一个想法:如果表1包含正确的数据,而表2包含错误的数据,为什么不干脆删除表2呢?