我的方案类似于以下问题“join comma delimited data column”。但是我需要从表T1中选择这个问题。
CREATE TABLE T1 ([col1] varchar(2), [col2] varchar(5));
INSERT INTO T1 ([col1], [col2], [col3])
VALUES
('C1', 'john',8),
('C2', 'alex',10),
('C3', 'piers',10),
('C4', 'sara',10);
CREATE TABLE T2 ([col1] varchar(2), [col2] varchar(8));
INSERT INTO T2 ([col1], [col2] , [col3])
VALUES
('R1', 'C1,C4',10),
(NULL, 'C3,C2,C5',10),
('R3', 'C5,C1,C4',8);
在最终结果中,我需要从表T1中选择值,并在表T2中选择是否存在相应的非空值。加入时还需要考虑[col3]
。
预期结果
---约翰,是---(因为'R3'存在)
--- Alex,不是---
--- Piers,No ---
--- Sara,是---(因为'R1'存在)
问题
在Oracle 8i中编写此查询的最佳方法是什么?
答案 0 :(得分:1)
试试这个:
SELECT
T1.col2
,CASE WHEN T2.col1 IS NULL THEN 'No' ELSE 'Yes' END
FROM T1
LEFT OUTER JOIN T2 ON ',' + T2.col2 + ',' LIKE '%,' + T1.col1 + ',%'
AND T1.col3 = T2.col3
如果您有可能重复,并且想要消除它们(显示“是”,则使用此项:
SELECT DISTINCT
T1.col2
,MAX(CASE WHEN T2.col1 IS NULL THEN 'No' ELSE 'Yes' END)
FROM T1
LEFT OUTER JOIN T2 ON ',' + T2.col2 + ',' LIKE '%,' + T1.col1 + ',%'
AND T1.col3 = T2.col3
GROUP BY
T1.col2
答案 1 :(得分:1)
此查询应该可以正常工作(fiddle):
SELECT col2,
DECODE((SELECT COUNT(1)
FROM T2
WHERE T1.col3 = T2.col3
AND T2.col1 IS NOT NULL
AND T2.col2 LIKE '%' || T1.col1 || '%'),
0, 'NO', 'YES')
FROM T1
我对SQL Server并不熟悉,但我认为,这样的事情应该在那里工作:
SELECT COL2,
CASE WHEN (SELECT COUNT(1)
FROM T2
WHERE T2.COL1 IS NOT NULL
AND T2.COL2 LIKE '%' + T1.COL1 + '%'
AND T1.COL3 = T2.COL3) > 0
THEN 'YES'
ELSE 'NO' END
FROM T1
为了获得更准确的匹配,只需在字符串比较子句中添加逗号和完全匹配。例如:
SELECT col2,
DECODE((SELECT COUNT(1)
FROM T2
WHERE T1.col3 = T2.col3
AND T2.col1 IS NOT NULL
AND (T2.col2 LIKE '%,' || T1.col1 || ',%'
OR T1.col1 = T2.col2)),
0, 'NO', 'YES')
FROM T1