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