我有两张表Person
和Interest
Person
表格结构
Id | Name
Interest
表格结构
Id | Person Id | Interest Category
我的问题是如何让那些喜欢“音乐”和“电影”以及“运动”类别的人。该类别将是动态的。
所以它会喜欢使用IN运算符,但是在IN运算符中使用AND条件而不是OR条件。
SELECT `Person Id` FROM Interest
WHERE `Interest Category` IN ('music', 'movie', 'sport');
答案 0 :(得分:3)
您可以使用HAVING COUNT
。这个数字也必须是动态的。
SELECT person_id
FROM interest
WHERE interest_category IN ( 'music', 'movie', 'sport');
GROUP BY person_id
HAVING COUNT(*) = 3;
答案 1 :(得分:2)
SELECT DISTINCT p.id
FROM Person p
JOIN Interest i1 ON p.id = i1.person_id AND i1.interest_category = 'music'
JOIN Interest i2 ON p.id = i2.person_id AND i2.interest_category = 'movie'
JOIN Interest i3 ON p.id = i3.person_id AND i3.interest_category = 'sport'
答案 2 :(得分:0)
试试这个
SELECT DISTINCT DECODE(A.RES, B.RES, I.INTEREST_CATEGORY, 'FALSE') AS FINAL_RES
FROM INTEREST I,
TABLE(SYS.DBMS_DEBUG_VC2COLl('music', 'movie', 'sport')),
(SELECT LENGTH(WM_CONCAT(COLUMN_VALUE)) AS RES
FROM TABLE(SYS.DBMS_DEBUG_VC2COLl('music', 'movie', 'sport'))) A,
(SELECT LENGTH(WM_CONCAT(DISTINCT I.INTEREST_CATEGORY)) AS RES
FROM TABLE(SYS.DBMS_DEBUG_VC2COLl('music', 'movie', 'sport')),
INTEREST I
WHERE I.INTEREST_CATEGORY = COLUMN_VALUE) B
WHERE I.INTEREST_CATEGORY = COLUMN_VALUE
此查询包含2个部分
(SELECT LENGTH(WM_CONCAT(DISTINCT I.INTEREST_CATEGORY)) AS RES
FROM TABLE(SYS.DBMS_DEBUG_VC2COLl('music', 'movie', 'sport')),
INTEREST I
WHERE I.INTEREST_CATEGORY = COLUMN_VALUE) B
这将计算作为输入提供的值的长度
第二个查询
(SELECT LENGTH(WM_CONCAT(COLUMN_VALUE)) AS RES
FROM TABLE(SYS.DBMS_DEBUG_VC2COLl('music', 'movie', 'sport')))
计算与数据库条目匹配的类别的长度。
然后最终比较这两个长度并返回ID。
这是完成这项工作的一个很长的方法,但是如果您不想使用group by(编码小得多),这可能是您查询的方法。
希望有所帮助