Sql 将两条记录选为一行

Sql 将两条记录选为一行,sql,sql-server,tsql,Sql,Sql Server,Tsql,我试图使用下面的查询将两行合并成一行,但它仍然返回两条记录。我是否可以让它处理单个查询?谢谢你的建议 表A +------+-------+----------+ | A_ID | EN_ID | COMMENTS | +------+-------+----------+ | 2 | 10 | test | +------+-------+----------+ 表B +-------+--------+ | EN_ID | ADD_ID | +-------+-----

我试图使用下面的查询将两行合并成一行,但它仍然返回两条记录。我是否可以让它处理单个查询?谢谢你的建议

表A

+------+-------+----------+
| A_ID | EN_ID | COMMENTS |
+------+-------+----------+
|    2 |    10 | test     |
+------+-------+----------+
表B

+-------+--------+
| EN_ID | ADD_ID |
+-------+--------+
|    10 |    101 |
|    10 |    102 |
+-------+--------+
表C

+--------+-------------+-------------+-----------+
| ADD_ID | ADD_TYPE_ID |   street    |   city    |
+--------+-------------+-------------+-----------+
|    101 |           1 | teststreet1 | citytest1 |
|    102 |           2 | teststreet2 | Citytest2 |
+--------+-------------+-------------+-----------+
期望结果

+-------+----------+-------------+-----------+-------------+-----------+
| EN_ID | COMMENTS |  street_1   |  city_1   |  street_2   |  city_2   |
+-------+----------+-------------+-----------+-------------+-----------+
|     3 | test     | teststreet1 | citytest1 | teststreet2 | Citytest2 |
+-------+----------+-------------+-----------+-------------+-----------+
质疑

select    
    A.EN_ID, 
    A.COMMENTS, 
    C1.STREET as strret_1, 
    C1.CITY as city_1,  
    C2.STREET as strret_2, 
    C2.CITY as city_2  
from      
    TABLE_A A
left join 
    TABLE_B B ON
    B.EN_ID = A.EN_ID 
left join 
    TABLE_C C1 
    ON C1.ADD_ID = B.ADD_ID 
    and C1.ADD_TYPE_ID = 1
left join 
    TABLE_C C2 
    ON  C2.ADD_ID = B.ADD_ID 
    and C2.ADD_TYPE_ID = 2
    and A.A_ID = 2;
编辑 试着这样做:

SELECT a.en_id, a.comments, c1.street AS street_1, c1.city AS city_1,
       c2.street AS street_2, c2.city AS city_2  
  FROM table_a a
  LEFT JOIN table_b b1 ON b1.en_id = a.en_id 
  LEFT JOIN table_c c1 ON c1.add_id = b1.add_id AND c1.add_type_id = 1
  LEFT JOIN table_b b2 ON b2.en_id = a.en_id AND b1.add_id <> b2.add_id
  LEFT JOIN table_c c2 ON c2.add_id = b2.add_id AND c2.add_type_id = 2
  WHERE a.a_id = 2 AND ( b1.add_id IS NOT NULL OR b2.add_id IS NOT NULL )
这样就行了

DECLARE @tA TABLE (A_ID INT, EN_ID INT, COMMENTS VARCHAR(255))
INSERT INTO @tA VALUES
(2,10,'test')

DECLARE @tB TABLE (EN_ID INT, ADD_ID INT)
INSERT INTO @tB VALUES
(10,101),
(10,102)

DECLARE @tC TABLE (ADD_ID INT, ADD_TYPE_ID INT, Street VARCHAR(255), City VARCHAR(255))
INSERT INTO @tC VALUES
(101,1,'teststreet1','citytest1'),        
(102,2,'teststreet2','Citytest2') 

SELECT A.EN_ID, A.COMMENTS, MAX(C1.Street) AS Street1, MAX(C1.City) AS City1, MAX(C2.Street) AS Street2, MAX(C2.City) AS City2
FROM @tA AS A
LEFT OUTER JOIN @tB AS B ON B.EN_ID = A.EN_ID
LEFT OUTER JOIN (SELECT * FROM @tC WHERE ADD_TYPE_ID = 1) AS C1 ON C1.ADD_ID = B.ADD_ID 
LEFT OUTER JOIN (SELECT * FROM @tC WHERE ADD_TYPE_ID = 2) AS C2 ON C2.ADD_ID = B.ADD_ID 
GROUP BY A.EN_ID, A.COMMENTS
结果

EN_ID  COMMENTS  Street1      City1      Street2      City2
----------------------------------------------------------------
10     test      teststreet1  citytest1  teststreet2  Citytest2
另一种更快的方法:

SELECT    
    A.EN_ID, 
    A.COMMENTS,
    SUM(CASE WHEN C.ADD_TYPE_ID = 1 THEN C.city ELSE '' END) AS city1,
    SUM(CASE WHEN C.ADD_TYPE_ID = 1 THEN C.street ELSE '' END) AS street1,
    SUM(CASE WHEN C.ADD_TYPE_ID = 2 THEN C.city ELSE '' END) AS city2,
    SUM(CASE WHEN C.ADD_TYPE_ID = 2 THEN C.street ELSE '' END) AS street2
FROM      
    TABLE_A A
left join TABLE_B as B ON (B.EN_ID = A.EN_ID) 
left join TABLE_C AS C ON (C.ADD_ID = B.ADD_ID)
GROUP BY A.EN_ID, A.COMMENTS

注意:如果C.city或C.street有一些空值,您可能会收到警告。如果是这样,请使用ISNULL(C.city“”)和ISNULL(C.street“”)语法…

,其中C2.ADD\u TYPE\u ID=2
否,这不是一件事。。。从该语句中删除
,其中
。我已将其删除。我仍然得到了相同的结果。如何得到EN_ID=3。不要害羞地添加用于表变量的DDL,以便其他人可以在本地运行。虽然这与OP预期的结果不匹配,但可能是最正确的。此查询仍返回2条记录。表b有2条记录。这可能是原因。
SELECT    
    A.EN_ID, 
    A.COMMENTS,
    SUM(CASE WHEN C.ADD_TYPE_ID = 1 THEN C.city ELSE '' END) AS city1,
    SUM(CASE WHEN C.ADD_TYPE_ID = 1 THEN C.street ELSE '' END) AS street1,
    SUM(CASE WHEN C.ADD_TYPE_ID = 2 THEN C.city ELSE '' END) AS city2,
    SUM(CASE WHEN C.ADD_TYPE_ID = 2 THEN C.street ELSE '' END) AS street2
FROM      
    TABLE_A A
left join TABLE_B as B ON (B.EN_ID = A.EN_ID) 
left join TABLE_C AS C ON (C.ADD_ID = B.ADD_ID)
GROUP BY A.EN_ID, A.COMMENTS