0

我有一个类似于以下问题的场景“加入逗号分隔的数据列”。但是这个问题是不同的,我需要从表 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]

预期结果

--- John,是的 --- (因为存在“R3”)

--- 亚历克斯,不 ---

--- 码头,没有 ---

--- Sara,是的 ---(因为存在“R1”)

问题

在 Oracle 8i 中编写此查询的最佳方法是什么?

4

2 回答 2

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 
于 2014-02-17T12:32:28.877 回答
1

此查询应该可以正常工作(小提琴):

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
于 2014-02-17T12:40:50.480 回答