按共享数据值过滤SQL查询结果,类似于iTunes Get Info

时间:2014-07-14 22:57:26

标签: sql ms-access

我正在尝试进行SQl查询(MS Access)并且仅返回Like个字段,类似于iTunes,您可以在其中选择多首歌曲,然后在编辑各自的数据时,您可以过滤输出每首选定歌曲不共享的数据。

例如,我有一个类似于

的表
ID,date,weight,buyerid
123,21/07/2014,5,22
124,21/07/2014,5,23
125,22/08/2014,5,23

如果我搜索所有三个ID(123124125)的相似结果,我只会在weight列下收到数据,因为所有三个选项都具有相同的weight。同样,如果我使用ID s 123124进行搜索,则会返回dateweight值,因为ID的共享那些数据值。不相似的数据会返回null或没有结果。

这在单个查询中是否可行?

编辑: rephrase(尽我所能解释)...我想搜索一个数据表(多个字段),只收到一行结果。通常类似的搜索会返回多行,其中一些字段包含相同的数据,而其他字段则没有,但我希望它过滤后只返回一行,其中包含每个字段中所有结果相同的数据(如果不相同则不返回任何内容) )。

我的另一个选择是遍历标准查询并拉出与每个字段匹配的所有数据,但我希望它可以在单个SQL查询中完成。

希望更好。

1 个答案:

答案 0 :(得分:0)

我认为你正在寻找这样的东西(假设你的表名为Table1):

SELECT  t1.SharedAttributes
FROM
(
        SELECT  ID, CStr([Weight]) AS SharedAttributes
        FROM    Table1
        WHERE   ID IN (123, 124)

        UNION ALL

        SELECT  ID, CStr([Date]) AS SharedAttributes
        FROM    Table1
        WHERE   ID IN (123, 124)
) t1,
(
        SELECT COUNT(*) AS DistinctIDs
        FROM (SELECT DISTINCT ID FROM Table1 WHERE ID IN (123, 124))
) t2
GROUP BY t1.SharedAttributes, t2.DistinctIDs
HAVING COUNT(*) = t2.DistinctIDs;

这会产生:

SharedAttributes
21/07/2014
5

虽然:

SELECT  t1.SharedAttributes
FROM
(
        SELECT  ID, CStr([Weight]) AS SharedAttributes
        FROM    Table1
        WHERE   ID IN (123, 124, 125)

        UNION ALL

        SELECT  ID, CStr([Date]) AS SharedAttributes
        FROM    Table1
        WHERE   ID IN (123, 124, 125)
) t1,
(
        SELECT COUNT(*) AS DistinctIDs
        FROM (SELECT DISTINCT ID FROM Table1 WHERE ID IN (123, 124, 125))
) t2
GROUP BY t1.SharedAttributes, t2.DistinctIDs
HAVING COUNT(*) = t2.DistinctIDs;

产生

SharedAttributes
5

代码有点丑陋多次使用相同的WHERE子句,但我不认为它可以帮助。另一种方法是将所有搜索到的ID放到一个表中,而不是WHERE子句,INNER JOIN到每个查询中的表。另外,需要注意的是:因为您希望将所有结果放在一列中,所以我们必须将所有值转换为通用数据类型;在这种情况下,字符串。