2013-10-05 167 views
2

当找到独特的价值观,我有以下表,versiontrim叫,一些样本数据:比较2个集

version_id trim_id 
    410  3 
    410  5 
    410  10 
    410  15 
    410  20 
    411  2 
    411  5 
    411  15 
    411  25 
    411  28 

另一个表,修剪,保持每个trim_id的细节,比如如下:

trim_id trim 
    2  Air conditioner auto    
    3  Air conditioner manual 
    5  Airbag 
    10  Cloth seats 
    25  Leather seats 
    etc..... 

我正在为每个SET 2的version_id提取唯一的trim_id。结果应该看起来像如下:

version_id trim_id trim     version_id trim_id  trim 
              411   2   Air conditioner auto 
410  3  Air conditioner manual 
410  10  Cloth seats 
              411   25  Leather seats 
410  20  blahblah 
              411   28   blah.... 
etc... 

我还是设法得到每个单独设置使用下面的查询,交换的VERSION_ID的:

SELECT version_id, trim_id, trim 
FROM versiontrim a 
INNER JOIN trims USING(trim_id) 
WHERE a.version_id = 411 
AND NOT EXISTS 
(
SELECT * FROM versiontrim b 
INNER JOIN trims USING(trim_id) 
WHERE a.trim_id = b.trim_id 
AND b.version_id = 410 
) 

我相信还有一个更简单的方法来做到这一点,有只是一个查询,以便我可以正确输出它。 感谢您的帮助。

+0

哪'trim_id'要选择每个'version_id'? 'min''max'? –

+0

我相信这个问题已被问过100次,但没有像这一个正确描述,值得回答,虽然:) – dbf

+0

马哈茂德,没有最小或最大。正如您在示例集中所看到的,我正在为每个version_id寻找唯一的trim_id。仍然在示例中,trim_id 5和15不是结果集的一部分,因为它们都出现在version_id'中。 – BernardA

回答

1
SELECT 
    CASE 
    WHEN v.version_id = 410 THEN v.version_id 
    ELSE '' 
    END AS Left_Version 
    ,CASE 
    WHEN v.version_id = 410 THEN v.trim_id 
    ELSE '' 
    END AS Left_Trim_id 
    ,CASE 
    WHEN v.version_id = 410 THEN t.trim 
    ELSE '' 
    END AS Left_Trim 
    ,CASE 
    WHEN v.version_id = 411 THEN v.version_id 
    ELSE '' 
    END AS Right_Version 
    ,CASE 
    WHEN v.version_id = 411 THEN v.trim_id 
    ELSE '' 
    END AS Right_Trim_id 
    ,CASE 
    WHEN v.version_id = 411 THEN t.trim 
    ELSE '' 
    END AS Right_Trim 
FROM(SELECT trim_id, COUNT(*) 
    FROM versiontrim 
    WHERE version_id IN (410,411) 
    GROUP BY trim_id 
    HAVING COUNT(*) = 1) AS vt 
JOIN versiontrim AS v 
ON v.trim_id = vt.trim_id 
    AND v.version_id IN (410,411) 
JOIN trims AS t 
ON v.trim_id = t.trim_id 
GROUP BY v.trim_id 
ORDER BY v.trim_id; 
+0

感谢AgRizzo。完美的作品。最后一个AND子句(410,410)存在拼写错误,应为(410,411)。干得好,再次感谢。 – BernardA

0

试试这个::

Select 
version_id, trim_id, trim 
FROM versiontrim a 
INNER JOIN trims t on (a.trim_id=t.trim_id) 
GROUP BY a.version_id, t.trim_id 
+0

谢谢萨西康德,但这不起作用。请注意,在某些情况下,您需要引用特定的version_id(案例中的410和411)。 Table versiontrim包含了大量的version_id,我需要的是比较其中的一组。 – BernardA

+0

看看你是否关注视图部分,实际上应该在应用层级处理那部分而不是在数据库级别 –