我是SQL的新手,对一个问题有点纠结。我有一张桌子,结构如下...表格格式是我不能更改的。我尝试过内部连接和交叉连接,但这对我没有太大帮助。
我必须检索所有的记录,这取决于我的输入,例如,如果我的输入将是芝加哥,轿车和冷。
我应该只检索芝加哥或轿车或冷或芝加哥和轿车或芝加哥和冷等等的组合。例如,在下面的表中,ID 4不应该被检索,因为它是纽约和chilly的组合。
任何帮助都将不胜感激。
ID TYPE CODE
1 CITY Chicago
1 CAR SEDAN
1 WEATHER CHILLY
2 WEATHER CHILLY
2 CAR SEDAN
3 CITY Chicago
4 CITY New York
4 CAR SEDAN

发布于 2018-06-28 22:54:51
赛,
你可以试一试,看看这是不是你想要的。
我确实在原来的示例表中添加了一行,只是为了帮助演示如何呈现该SQL。
ID TYPE CODE
1 CITY Chicago
1 CITY Dallas
1 CAR SEDAN
1 WEATHER CHILLY
2 WEATHER CHILLY
2 CAR SEDAN
3 CITY Chicago
4 CITY New York
4 CAR SEDAN
使用此SQL将使您的表输出呈现为更易于管理的格式。
SELECT * FROM
((select id, type, code from TABLE1 t1)
pivot (listagg(code,',') within group (order by type)
for type in('CITY' as CITY,'CAR' as CAR, 'WEATHER' as WEATHER)))
order by id这将把上面的表格格式转换为下面的格式化记录集。
ID CITY CAR WEATHER
1 Chicago,Dallas SEDAN CHILLY
2 (null) SEDAN CHILLY
3 Chicago (null) (null)
4 New York SEDAN (null)
当然,如果您希望在输出中的每个项目周围放置引号,您可以这样做。
SELECT * FROM
((select id, type, code from TABLE1 t1)
pivot (listagg(''''||code||'''',',') within group (order by type)
for type in('CITY' as CITY,'CAR' as CAR, 'WEATHER' as WEATHER)))
order by id然后,这将呈现为
ID CITY CAR WEATHER
1 'Chicago','Dallas' 'SEDAN' 'CHILLY'
2 (null) 'SEDAN' 'CHILLY'
3 'Chicago' (null) (null)
4 'New York' 'SEDAN' (null)
这是你想要的更多吗?
发布于 2018-06-25 10:42:04
您可以使用group by和having
select id
from t
group by id
having sum(case when code in ('Chicago', 'Sedan', 'chilly') then 1 else 0 end) = count(*);也许你打算:
having sum(case when type = 'City' and code <> 'Chicago' then 1 else 0 end) = 0 and
sum(case when type = 'Car' and code <> 'Sedan' then 1 else 0 end) = 0 and
sum(case when type = 'Weather' and code <> 'Chilly' then 1 else 0 end) = 0 发布于 2018-06-25 11:01:22
戈登查询的略微扩展
SELECT * FROM TABLE1 t1
WHERE t1.ID IN
(SELECT ID
FROM TABLE1 t2
GROUP BY ID
HAVING
SUM(CASE WHEN CODE IN ('Chicago','SEDAN','CHILLY')
THEN 1 ELSE 0 END)
= COUNT(*)
)https://stackoverflow.com/questions/51015648
复制相似问题