使用和不使用连接列连接表

时间:2014-02-17 12:14:38

标签: sql oracle oracle8i

我的方案类似于以下问题“join comma delimited data column”。但是我需要从表T1中选择这个问题。

Reference Fiddle

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中编写此查询的最佳方法是什么?

2 个答案:

答案 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