2013-03-21 124 views
0

示例。
我有两个表从多个表中选择多个列

CAR 
id name 
1 bmw 
2 fiat 

Car_info 
car_id field_name country 
    1  year   2000 
    1  country  germany 
    2  year   1988 
    2  country  italy 

如何在一个选择查询我能得到这个?

id name year country 
1 bmw 2000 germany 
2 fiat 1988 italy 
+1

为什么您的Car_info上的“国家/地区”列包含年份和国家/地区?不应该把这个列命名为'field_val',因为它的名字被设置为'field_name'? – fcm 2013-03-21 11:12:02

回答

0

理想情况下,您应该在car_info表中指定一列,指定在该行上显示的信息类型。即类型1是年份,类型2是国家。

你可以避开这个问题通过加入到car_info表上加入两次指定“与”条件,就像这样:

SELECT car.ID, car.Name, ci1.country as [YEAR], ci2.country as COUNTRY 
FROM car 
INNER JOIN car_info AS ci1 ON Car.ID = ci1.car_id AND ci1.field_name = 'year' 
INNER JOIN car_info AS ci2 ON Car.ID = ci2.car_id AND ci2.field_name = 'country' 
+0

这是最轻,最正确的答案。感谢 – cosset 2013-03-21 11:20:46

0
WITH car AS (
    SELECT 1 AS id, 'BMW' AS name FROM dual 
    UNION ALL 
    SELECT 2, 'Fiat' FROM dual 
) 
, car_info AS (
    SELECT 1 AS car_id, 'Year' AS field_name, '2000' AS field_val FROM dual 
    UNION ALL 
    SELECT 1, 'Country', 'Germany' FROM dual 
    UNION ALL 
    SELECT 2, 'Year', '1988' FROM dual 
    UNION ALL 
    SELECT 2, 'Country', 'Italy' FROM dual 
) 
    SELECT c.*, car_year.field_val AS yr, car_country.field_val AS country 
    FROM car c 
    JOIN car_info car_year ON c.id = car_year.car_id AND car_year.field_name = 'Year' 
    JOIN car_info car_country ON c.id = car_country.car_id AND car_country.field_name = 'Country' 
; 
+0

' dual'?这是一个oracle查询。 OP想要'sql server'中的答案 – praveen 2013-03-21 11:14:50

+0

这就是sqlserver – cosset 2013-03-21 11:15:50

+0

然后忘掉'dual'部分。从主“SELECT c。*”开始运行查询。你会得到你想要的。 – Rachcha 2013-03-21 11:16:12

0

试试这个: 您可以使用PIVOT,然后与Car

with cte as 
(
Select car_id,[year],[country] 
from 
(Select car_id,field_name,countryName 
    from car_info 
)pv 
pivot 
(
    max(countryName) 
    FOR field_name IN ([year],[country]) 
)pvt 
) 
Select c.name,ct.year,ct.country 
from car c inner join cte ct 
on ct.car_id=c.id 

演示中加入SQL Fiddle