Mysql 从四个国家/地区代码列中至少有三个具有不同国家/地区代码计数的表中筛选记录

Mysql 从四个国家/地区代码列中至少有三个具有不同国家/地区代码计数的表中筛选记录,mysql,sql,oracle,Mysql,Sql,Oracle,我有一个小问题 +----+---------------+--------------+---------------+--------------+ | ID | Country CodeR | CountryCodeB | CountryCodeBR | CountryCodeF | +----+---------------+--------------+---------------+--------------+ | 1 | US | US

我有一个小问题

+----+---------------+--------------+---------------+--------------+
| ID | Country CodeR | CountryCodeB | CountryCodeBR | CountryCodeF |
+----+---------------+--------------+---------------+--------------+
|  1 | US            | US           | US            | UK           |
|  2 | US            | UK           | US            | PK           |
|  3 | US            | UK           | PK            | IND          |
+----+---------------+--------------+---------------+--------------+
从上表 从上表中筛选具有不同国家/地区代码列计数的记录(至少四分之三的国家/地区代码列)

从上表我需要的结果应该是如下所示

+----+---------------+--------------+---------------+--------------+
| ID | Country CodeR | CountryCodeB | CountryCodeBR | CountryCodeF |
+----+---------------+--------------+---------------+--------------+
|    |               |              |               |              |
|  2 | US            | UK           | US            | PK           |
|  3 | US            | UK           | PK            | IND          |
+----+---------------+--------------+---------------+--------------+

当前的数据结构使查询变得困难,因为count distinct函数对行而不是列进行操作。一种方法是将数据转换为高格式,然后按
ID
进行聚合:

SELECT t1.*
FROM yourTable t1
INNER JOIN
(
    SELECT ID
    FROM
    (
        SELECT ID, CountryCodeR AS CountryCode FROM yourTable
        UNION ALL
        SELECT ID, CountryCodeB FROM yourTable
        UNION ALL
        SELECT ID, CountryCodeBR FROM yourTable
        UNION ALL
        SELECT ID, CountryCodeF FROM yourTable
    ) t
    GROUP BY ID
    HAVING COUNT(DISTINCT CountryCode) >= 3
) t2
    ON t1.ID = t2.ID;
以上内容可能是您在MySQL上所能做的最好的。如果您使用的是Oracle,那么就可以使用unpivot和CTE等工具来创建外观更好的查询


当前的数据结构使查询变得困难,因为count distinct函数对行而不是列进行操作。一种方法是将数据转换为高格式,然后按
ID
进行聚合:

SELECT t1.*
FROM yourTable t1
INNER JOIN
(
    SELECT ID
    FROM
    (
        SELECT ID, CountryCodeR AS CountryCode FROM yourTable
        UNION ALL
        SELECT ID, CountryCodeB FROM yourTable
        UNION ALL
        SELECT ID, CountryCodeBR FROM yourTable
        UNION ALL
        SELECT ID, CountryCodeF FROM yourTable
    ) t
    GROUP BY ID
    HAVING COUNT(DISTINCT CountryCode) >= 3
) t2
    ON t1.ID = t2.ID;
以上内容可能是您在MySQL上所能做的最好的。如果您使用的是Oracle,那么就可以使用unpivot和CTE等工具来创建外观更好的查询


以下是几种不用旋转表格和自连接的方法:

在Oracle中,您可以将项目放入一个集合,然后使用
SET()
获取唯一的项目,并使用
CARDINALITY
获取集合的大小:

Oracle 11g R2架构设置

CREATE TABLE TABLE_NAME(
  ID,
  CountryCodeR,
  CountryCodeB,
  CountryCodeBR,
  CountryCodeF
) As
SELECT 1, 'US', 'US', 'US', 'UK' FROM DUAL UNION ALL
SELECT 2, 'US', 'UK', 'US', 'PK' FROM DUAL UNION ALL
SELECT 3, 'US', 'UK', 'PK', 'IND' FROM DUAL UNION ALL
SELECT 4, 'A', 'B', 'C', 'D' FROM DUAL UNION ALL
SELECT 5, 'A', 'B', 'C', 'A' FROM DUAL UNION ALL
SELECT 6, 'A', 'B', 'A', 'D' FROM DUAL UNION ALL
SELECT 7, 'A', 'A', 'C', 'D' FROM DUAL UNION ALL
SELECT 8, 'A', 'B', 'C', 'B' FROM DUAL UNION ALL
SELECT 9, 'A', 'B', 'B', 'D' FROM DUAL UNION ALL
SELECT 10, 'A', 'B', 'C', 'C' FROM DUAL UNION ALL
SELECT 11, 'A', 'B', 'B', 'A' FROM DUAL UNION ALL
SELECT 12, 'A', 'B', 'A', 'B' FROM DUAL UNION ALL
SELECT 13, 'A', 'A', 'C', 'C' FROM DUAL UNION ALL
SELECT 14, 'A', 'A', 'A', 'B' FROM DUAL UNION ALL
SELECT 15, 'A', 'A', 'B', 'A' FROM DUAL UNION ALL
SELECT 16, 'A', 'B', 'A', 'A' FROM DUAL UNION ALL
SELECT 17, 'A', 'B', 'B', 'B' FROM DUAL UNION ALL
SELECT 18, 'A', 'A', 'A', 'A' FROM DUAL
/

CREATE TYPE StringList IS TABLE OF VARCHAR2(5)
/
SELECT *
FROM   table_name
WHERE  CARDINALITY(
         SET(
           StringList(
             CountryCodeR,
             CountryCodeB,
             CountryCodeBR,
             CountryCodeF
           )
         )
       ) >= 3
| ID | COUNTRYCODER | COUNTRYCODEB | COUNTRYCODEBR | COUNTRYCODEF |
|----|--------------|--------------|---------------|--------------|
|  2 |           US |           UK |            US |           PK |
|  3 |           US |           UK |            PK |          IND |
|  4 |            A |            B |             C |            D |
|  5 |            A |            B |             C |            A |
|  6 |            A |            B |             A |            D |
|  7 |            A |            A |             C |            D |
|  8 |            A |            B |             C |            B |
|  9 |            A |            B |             B |            D |
| 10 |            A |            B |             C |            C |
| ID | COUNTRYCODER | COUNTRYCODEB | COUNTRYCODEBR | COUNTRYCODEF |
|----|--------------|--------------|---------------|--------------|
|  2 |           US |           UK |            US |           PK |
|  3 |           US |           UK |            PK |          IND |
|  4 |            A |            B |             C |            D |
|  5 |            A |            B |             C |            A |
|  6 |            A |            B |             A |            D |
|  7 |            A |            A |             C |            D |
|  8 |            A |            B |             C |            B |
|  9 |            A |            B |             B |            D |
| 10 |            A |            B |             C |            C |
查询1

CREATE TABLE TABLE_NAME(
  ID,
  CountryCodeR,
  CountryCodeB,
  CountryCodeBR,
  CountryCodeF
) As
SELECT 1, 'US', 'US', 'US', 'UK' FROM DUAL UNION ALL
SELECT 2, 'US', 'UK', 'US', 'PK' FROM DUAL UNION ALL
SELECT 3, 'US', 'UK', 'PK', 'IND' FROM DUAL UNION ALL
SELECT 4, 'A', 'B', 'C', 'D' FROM DUAL UNION ALL
SELECT 5, 'A', 'B', 'C', 'A' FROM DUAL UNION ALL
SELECT 6, 'A', 'B', 'A', 'D' FROM DUAL UNION ALL
SELECT 7, 'A', 'A', 'C', 'D' FROM DUAL UNION ALL
SELECT 8, 'A', 'B', 'C', 'B' FROM DUAL UNION ALL
SELECT 9, 'A', 'B', 'B', 'D' FROM DUAL UNION ALL
SELECT 10, 'A', 'B', 'C', 'C' FROM DUAL UNION ALL
SELECT 11, 'A', 'B', 'B', 'A' FROM DUAL UNION ALL
SELECT 12, 'A', 'B', 'A', 'B' FROM DUAL UNION ALL
SELECT 13, 'A', 'A', 'C', 'C' FROM DUAL UNION ALL
SELECT 14, 'A', 'A', 'A', 'B' FROM DUAL UNION ALL
SELECT 15, 'A', 'A', 'B', 'A' FROM DUAL UNION ALL
SELECT 16, 'A', 'B', 'A', 'A' FROM DUAL UNION ALL
SELECT 17, 'A', 'B', 'B', 'B' FROM DUAL UNION ALL
SELECT 18, 'A', 'A', 'A', 'A' FROM DUAL
/

CREATE TYPE StringList IS TABLE OF VARCHAR2(5)
/
SELECT *
FROM   table_name
WHERE  CARDINALITY(
         SET(
           StringList(
             CountryCodeR,
             CountryCodeB,
             CountryCodeBR,
             CountryCodeF
           )
         )
       ) >= 3
| ID | COUNTRYCODER | COUNTRYCODEB | COUNTRYCODEBR | COUNTRYCODEF |
|----|--------------|--------------|---------------|--------------|
|  2 |           US |           UK |            US |           PK |
|  3 |           US |           UK |            PK |          IND |
|  4 |            A |            B |             C |            D |
|  5 |            A |            B |             C |            A |
|  6 |            A |            B |             A |            D |
|  7 |            A |            A |             C |            D |
|  8 |            A |            B |             C |            B |
|  9 |            A |            B |             B |            D |
| 10 |            A |            B |             C |            C |
| ID | COUNTRYCODER | COUNTRYCODEB | COUNTRYCODEBR | COUNTRYCODEF |
|----|--------------|--------------|---------------|--------------|
|  2 |           US |           UK |            US |           PK |
|  3 |           US |           UK |            PK |          IND |
|  4 |            A |            B |             C |            D |
|  5 |            A |            B |             C |            A |
|  6 |            A |            B |             A |            D |
|  7 |            A |            A |             C |            D |
|  8 |            A |            B |             C |            B |
|  9 |            A |            B |             B |            D |
| 10 |            A |            B |             C |            C |

CREATE TABLE TABLE_NAME(
  ID,
  CountryCodeR,
  CountryCodeB,
  CountryCodeBR,
  CountryCodeF
) As
SELECT 1, 'US', 'US', 'US', 'UK' FROM DUAL UNION ALL
SELECT 2, 'US', 'UK', 'US', 'PK' FROM DUAL UNION ALL
SELECT 3, 'US', 'UK', 'PK', 'IND' FROM DUAL UNION ALL
SELECT 4, 'A', 'B', 'C', 'D' FROM DUAL UNION ALL
SELECT 5, 'A', 'B', 'C', 'A' FROM DUAL UNION ALL
SELECT 6, 'A', 'B', 'A', 'D' FROM DUAL UNION ALL
SELECT 7, 'A', 'A', 'C', 'D' FROM DUAL UNION ALL
SELECT 8, 'A', 'B', 'C', 'B' FROM DUAL UNION ALL
SELECT 9, 'A', 'B', 'B', 'D' FROM DUAL UNION ALL
SELECT 10, 'A', 'B', 'C', 'C' FROM DUAL UNION ALL
SELECT 11, 'A', 'B', 'B', 'A' FROM DUAL UNION ALL
SELECT 12, 'A', 'B', 'A', 'B' FROM DUAL UNION ALL
SELECT 13, 'A', 'A', 'C', 'C' FROM DUAL UNION ALL
SELECT 14, 'A', 'A', 'A', 'B' FROM DUAL UNION ALL
SELECT 15, 'A', 'A', 'B', 'A' FROM DUAL UNION ALL
SELECT 16, 'A', 'B', 'A', 'A' FROM DUAL UNION ALL
SELECT 17, 'A', 'B', 'B', 'B' FROM DUAL UNION ALL
SELECT 18, 'A', 'A', 'A', 'A' FROM DUAL
/

CREATE TYPE StringList IS TABLE OF VARCHAR2(5)
/
SELECT *
FROM   table_name
WHERE  CARDINALITY(
         SET(
           StringList(
             CountryCodeR,
             CountryCodeB,
             CountryCodeBR,
             CountryCodeF
           )
         )
       ) >= 3
| ID | COUNTRYCODER | COUNTRYCODEB | COUNTRYCODEBR | COUNTRYCODEF |
|----|--------------|--------------|---------------|--------------|
|  2 |           US |           UK |            US |           PK |
|  3 |           US |           UK |            PK |          IND |
|  4 |            A |            B |             C |            D |
|  5 |            A |            B |             C |            A |
|  6 |            A |            B |             A |            D |
|  7 |            A |            A |             C |            D |
|  8 |            A |            B |             C |            B |
|  9 |            A |            B |             B |            D |
| 10 |            A |            B |             C |            C |
| ID | COUNTRYCODER | COUNTRYCODEB | COUNTRYCODEBR | COUNTRYCODEF |
|----|--------------|--------------|---------------|--------------|
|  2 |           US |           UK |            US |           PK |
|  3 |           US |           UK |            PK |          IND |
|  4 |            A |            B |             C |            D |
|  5 |            A |            B |             C |            A |
|  6 |            A |            B |             A |            D |
|  7 |            A |            A |             C |            D |
|  8 |            A |            B |             C |            B |
|  9 |            A |            B |             B |            D |
| 10 |            A |            B |             C |            C |
查询2

CREATE TABLE TABLE_NAME(
  ID,
  CountryCodeR,
  CountryCodeB,
  CountryCodeBR,
  CountryCodeF
) As
SELECT 1, 'US', 'US', 'US', 'UK' FROM DUAL UNION ALL
SELECT 2, 'US', 'UK', 'US', 'PK' FROM DUAL UNION ALL
SELECT 3, 'US', 'UK', 'PK', 'IND' FROM DUAL UNION ALL
SELECT 4, 'A', 'B', 'C', 'D' FROM DUAL UNION ALL
SELECT 5, 'A', 'B', 'C', 'A' FROM DUAL UNION ALL
SELECT 6, 'A', 'B', 'A', 'D' FROM DUAL UNION ALL
SELECT 7, 'A', 'A', 'C', 'D' FROM DUAL UNION ALL
SELECT 8, 'A', 'B', 'C', 'B' FROM DUAL UNION ALL
SELECT 9, 'A', 'B', 'B', 'D' FROM DUAL UNION ALL
SELECT 10, 'A', 'B', 'C', 'C' FROM DUAL UNION ALL
SELECT 11, 'A', 'B', 'B', 'A' FROM DUAL UNION ALL
SELECT 12, 'A', 'B', 'A', 'B' FROM DUAL UNION ALL
SELECT 13, 'A', 'A', 'C', 'C' FROM DUAL UNION ALL
SELECT 14, 'A', 'A', 'A', 'B' FROM DUAL UNION ALL
SELECT 15, 'A', 'A', 'B', 'A' FROM DUAL UNION ALL
SELECT 16, 'A', 'B', 'A', 'A' FROM DUAL UNION ALL
SELECT 17, 'A', 'B', 'B', 'B' FROM DUAL UNION ALL
SELECT 18, 'A', 'A', 'A', 'A' FROM DUAL
/

CREATE TYPE StringList IS TABLE OF VARCHAR2(5)
/
SELECT *
FROM   table_name
WHERE  CARDINALITY(
         SET(
           StringList(
             CountryCodeR,
             CountryCodeB,
             CountryCodeBR,
             CountryCodeF
           )
         )
       ) >= 3
| ID | COUNTRYCODER | COUNTRYCODEB | COUNTRYCODEBR | COUNTRYCODEF |
|----|--------------|--------------|---------------|--------------|
|  2 |           US |           UK |            US |           PK |
|  3 |           US |           UK |            PK |          IND |
|  4 |            A |            B |             C |            D |
|  5 |            A |            B |             C |            A |
|  6 |            A |            B |             A |            D |
|  7 |            A |            A |             C |            D |
|  8 |            A |            B |             C |            B |
|  9 |            A |            B |             B |            D |
| 10 |            A |            B |             C |            C |
| ID | COUNTRYCODER | COUNTRYCODEB | COUNTRYCODEBR | COUNTRYCODEF |
|----|--------------|--------------|---------------|--------------|
|  2 |           US |           UK |            US |           PK |
|  3 |           US |           UK |            PK |          IND |
|  4 |            A |            B |             C |            D |
|  5 |            A |            B |             C |            A |
|  6 |            A |            B |             A |            D |
|  7 |            A |            A |             C |            D |
|  8 |            A |            B |             C |            B |
|  9 |            A |            B |             B |            D |
| 10 |            A |            B |             C |            C |
您还可以使用多个
CASE
语句:

SELECT *
FROM   table_name
WHERE  CASE
       WHEN CountryCodeR IN ( CountryCodeB, CountryCodeBR, CountryCodeF )
       THEN 1 ELSE 0
       END
       +
       CASE
       WHEN CountryCodeB IN ( CountryCodeBR, CountryCodeF )
       THEN 1 ELSE 0
       END
       +
       CASE
       WHEN CountryCodeBR IN ( CountryCodeF )
       THEN 1 ELSE 0
       END
       <= 1

这也适用于MySQL-

这里有几种方法可以做到这一点,而无需借助于数据透视表和自连接:

在Oracle中,您可以将项目放入一个集合,然后使用
SET()
获取唯一的项目,并使用
CARDINALITY
获取集合的大小:

Oracle 11g R2架构设置

CREATE TABLE TABLE_NAME(
  ID,
  CountryCodeR,
  CountryCodeB,
  CountryCodeBR,
  CountryCodeF
) As
SELECT 1, 'US', 'US', 'US', 'UK' FROM DUAL UNION ALL
SELECT 2, 'US', 'UK', 'US', 'PK' FROM DUAL UNION ALL
SELECT 3, 'US', 'UK', 'PK', 'IND' FROM DUAL UNION ALL
SELECT 4, 'A', 'B', 'C', 'D' FROM DUAL UNION ALL
SELECT 5, 'A', 'B', 'C', 'A' FROM DUAL UNION ALL
SELECT 6, 'A', 'B', 'A', 'D' FROM DUAL UNION ALL
SELECT 7, 'A', 'A', 'C', 'D' FROM DUAL UNION ALL
SELECT 8, 'A', 'B', 'C', 'B' FROM DUAL UNION ALL
SELECT 9, 'A', 'B', 'B', 'D' FROM DUAL UNION ALL
SELECT 10, 'A', 'B', 'C', 'C' FROM DUAL UNION ALL
SELECT 11, 'A', 'B', 'B', 'A' FROM DUAL UNION ALL
SELECT 12, 'A', 'B', 'A', 'B' FROM DUAL UNION ALL
SELECT 13, 'A', 'A', 'C', 'C' FROM DUAL UNION ALL
SELECT 14, 'A', 'A', 'A', 'B' FROM DUAL UNION ALL
SELECT 15, 'A', 'A', 'B', 'A' FROM DUAL UNION ALL
SELECT 16, 'A', 'B', 'A', 'A' FROM DUAL UNION ALL
SELECT 17, 'A', 'B', 'B', 'B' FROM DUAL UNION ALL
SELECT 18, 'A', 'A', 'A', 'A' FROM DUAL
/

CREATE TYPE StringList IS TABLE OF VARCHAR2(5)
/
SELECT *
FROM   table_name
WHERE  CARDINALITY(
         SET(
           StringList(
             CountryCodeR,
             CountryCodeB,
             CountryCodeBR,
             CountryCodeF
           )
         )
       ) >= 3
| ID | COUNTRYCODER | COUNTRYCODEB | COUNTRYCODEBR | COUNTRYCODEF |
|----|--------------|--------------|---------------|--------------|
|  2 |           US |           UK |            US |           PK |
|  3 |           US |           UK |            PK |          IND |
|  4 |            A |            B |             C |            D |
|  5 |            A |            B |             C |            A |
|  6 |            A |            B |             A |            D |
|  7 |            A |            A |             C |            D |
|  8 |            A |            B |             C |            B |
|  9 |            A |            B |             B |            D |
| 10 |            A |            B |             C |            C |
| ID | COUNTRYCODER | COUNTRYCODEB | COUNTRYCODEBR | COUNTRYCODEF |
|----|--------------|--------------|---------------|--------------|
|  2 |           US |           UK |            US |           PK |
|  3 |           US |           UK |            PK |          IND |
|  4 |            A |            B |             C |            D |
|  5 |            A |            B |             C |            A |
|  6 |            A |            B |             A |            D |
|  7 |            A |            A |             C |            D |
|  8 |            A |            B |             C |            B |
|  9 |            A |            B |             B |            D |
| 10 |            A |            B |             C |            C |
查询1

CREATE TABLE TABLE_NAME(
  ID,
  CountryCodeR,
  CountryCodeB,
  CountryCodeBR,
  CountryCodeF
) As
SELECT 1, 'US', 'US', 'US', 'UK' FROM DUAL UNION ALL
SELECT 2, 'US', 'UK', 'US', 'PK' FROM DUAL UNION ALL
SELECT 3, 'US', 'UK', 'PK', 'IND' FROM DUAL UNION ALL
SELECT 4, 'A', 'B', 'C', 'D' FROM DUAL UNION ALL
SELECT 5, 'A', 'B', 'C', 'A' FROM DUAL UNION ALL
SELECT 6, 'A', 'B', 'A', 'D' FROM DUAL UNION ALL
SELECT 7, 'A', 'A', 'C', 'D' FROM DUAL UNION ALL
SELECT 8, 'A', 'B', 'C', 'B' FROM DUAL UNION ALL
SELECT 9, 'A', 'B', 'B', 'D' FROM DUAL UNION ALL
SELECT 10, 'A', 'B', 'C', 'C' FROM DUAL UNION ALL
SELECT 11, 'A', 'B', 'B', 'A' FROM DUAL UNION ALL
SELECT 12, 'A', 'B', 'A', 'B' FROM DUAL UNION ALL
SELECT 13, 'A', 'A', 'C', 'C' FROM DUAL UNION ALL
SELECT 14, 'A', 'A', 'A', 'B' FROM DUAL UNION ALL
SELECT 15, 'A', 'A', 'B', 'A' FROM DUAL UNION ALL
SELECT 16, 'A', 'B', 'A', 'A' FROM DUAL UNION ALL
SELECT 17, 'A', 'B', 'B', 'B' FROM DUAL UNION ALL
SELECT 18, 'A', 'A', 'A', 'A' FROM DUAL
/

CREATE TYPE StringList IS TABLE OF VARCHAR2(5)
/
SELECT *
FROM   table_name
WHERE  CARDINALITY(
         SET(
           StringList(
             CountryCodeR,
             CountryCodeB,
             CountryCodeBR,
             CountryCodeF
           )
         )
       ) >= 3
| ID | COUNTRYCODER | COUNTRYCODEB | COUNTRYCODEBR | COUNTRYCODEF |
|----|--------------|--------------|---------------|--------------|
|  2 |           US |           UK |            US |           PK |
|  3 |           US |           UK |            PK |          IND |
|  4 |            A |            B |             C |            D |
|  5 |            A |            B |             C |            A |
|  6 |            A |            B |             A |            D |
|  7 |            A |            A |             C |            D |
|  8 |            A |            B |             C |            B |
|  9 |            A |            B |             B |            D |
| 10 |            A |            B |             C |            C |
| ID | COUNTRYCODER | COUNTRYCODEB | COUNTRYCODEBR | COUNTRYCODEF |
|----|--------------|--------------|---------------|--------------|
|  2 |           US |           UK |            US |           PK |
|  3 |           US |           UK |            PK |          IND |
|  4 |            A |            B |             C |            D |
|  5 |            A |            B |             C |            A |
|  6 |            A |            B |             A |            D |
|  7 |            A |            A |             C |            D |
|  8 |            A |            B |             C |            B |
|  9 |            A |            B |             B |            D |
| 10 |            A |            B |             C |            C |

CREATE TABLE TABLE_NAME(
  ID,
  CountryCodeR,
  CountryCodeB,
  CountryCodeBR,
  CountryCodeF
) As
SELECT 1, 'US', 'US', 'US', 'UK' FROM DUAL UNION ALL
SELECT 2, 'US', 'UK', 'US', 'PK' FROM DUAL UNION ALL
SELECT 3, 'US', 'UK', 'PK', 'IND' FROM DUAL UNION ALL
SELECT 4, 'A', 'B', 'C', 'D' FROM DUAL UNION ALL
SELECT 5, 'A', 'B', 'C', 'A' FROM DUAL UNION ALL
SELECT 6, 'A', 'B', 'A', 'D' FROM DUAL UNION ALL
SELECT 7, 'A', 'A', 'C', 'D' FROM DUAL UNION ALL
SELECT 8, 'A', 'B', 'C', 'B' FROM DUAL UNION ALL
SELECT 9, 'A', 'B', 'B', 'D' FROM DUAL UNION ALL
SELECT 10, 'A', 'B', 'C', 'C' FROM DUAL UNION ALL
SELECT 11, 'A', 'B', 'B', 'A' FROM DUAL UNION ALL
SELECT 12, 'A', 'B', 'A', 'B' FROM DUAL UNION ALL
SELECT 13, 'A', 'A', 'C', 'C' FROM DUAL UNION ALL
SELECT 14, 'A', 'A', 'A', 'B' FROM DUAL UNION ALL
SELECT 15, 'A', 'A', 'B', 'A' FROM DUAL UNION ALL
SELECT 16, 'A', 'B', 'A', 'A' FROM DUAL UNION ALL
SELECT 17, 'A', 'B', 'B', 'B' FROM DUAL UNION ALL
SELECT 18, 'A', 'A', 'A', 'A' FROM DUAL
/

CREATE TYPE StringList IS TABLE OF VARCHAR2(5)
/
SELECT *
FROM   table_name
WHERE  CARDINALITY(
         SET(
           StringList(
             CountryCodeR,
             CountryCodeB,
             CountryCodeBR,
             CountryCodeF
           )
         )
       ) >= 3
| ID | COUNTRYCODER | COUNTRYCODEB | COUNTRYCODEBR | COUNTRYCODEF |
|----|--------------|--------------|---------------|--------------|
|  2 |           US |           UK |            US |           PK |
|  3 |           US |           UK |            PK |          IND |
|  4 |            A |            B |             C |            D |
|  5 |            A |            B |             C |            A |
|  6 |            A |            B |             A |            D |
|  7 |            A |            A |             C |            D |
|  8 |            A |            B |             C |            B |
|  9 |            A |            B |             B |            D |
| 10 |            A |            B |             C |            C |
| ID | COUNTRYCODER | COUNTRYCODEB | COUNTRYCODEBR | COUNTRYCODEF |
|----|--------------|--------------|---------------|--------------|
|  2 |           US |           UK |            US |           PK |
|  3 |           US |           UK |            PK |          IND |
|  4 |            A |            B |             C |            D |
|  5 |            A |            B |             C |            A |
|  6 |            A |            B |             A |            D |
|  7 |            A |            A |             C |            D |
|  8 |            A |            B |             C |            B |
|  9 |            A |            B |             B |            D |
| 10 |            A |            B |             C |            C |
查询2

CREATE TABLE TABLE_NAME(
  ID,
  CountryCodeR,
  CountryCodeB,
  CountryCodeBR,
  CountryCodeF
) As
SELECT 1, 'US', 'US', 'US', 'UK' FROM DUAL UNION ALL
SELECT 2, 'US', 'UK', 'US', 'PK' FROM DUAL UNION ALL
SELECT 3, 'US', 'UK', 'PK', 'IND' FROM DUAL UNION ALL
SELECT 4, 'A', 'B', 'C', 'D' FROM DUAL UNION ALL
SELECT 5, 'A', 'B', 'C', 'A' FROM DUAL UNION ALL
SELECT 6, 'A', 'B', 'A', 'D' FROM DUAL UNION ALL
SELECT 7, 'A', 'A', 'C', 'D' FROM DUAL UNION ALL
SELECT 8, 'A', 'B', 'C', 'B' FROM DUAL UNION ALL
SELECT 9, 'A', 'B', 'B', 'D' FROM DUAL UNION ALL
SELECT 10, 'A', 'B', 'C', 'C' FROM DUAL UNION ALL
SELECT 11, 'A', 'B', 'B', 'A' FROM DUAL UNION ALL
SELECT 12, 'A', 'B', 'A', 'B' FROM DUAL UNION ALL
SELECT 13, 'A', 'A', 'C', 'C' FROM DUAL UNION ALL
SELECT 14, 'A', 'A', 'A', 'B' FROM DUAL UNION ALL
SELECT 15, 'A', 'A', 'B', 'A' FROM DUAL UNION ALL
SELECT 16, 'A', 'B', 'A', 'A' FROM DUAL UNION ALL
SELECT 17, 'A', 'B', 'B', 'B' FROM DUAL UNION ALL
SELECT 18, 'A', 'A', 'A', 'A' FROM DUAL
/

CREATE TYPE StringList IS TABLE OF VARCHAR2(5)
/
SELECT *
FROM   table_name
WHERE  CARDINALITY(
         SET(
           StringList(
             CountryCodeR,
             CountryCodeB,
             CountryCodeBR,
             CountryCodeF
           )
         )
       ) >= 3
| ID | COUNTRYCODER | COUNTRYCODEB | COUNTRYCODEBR | COUNTRYCODEF |
|----|--------------|--------------|---------------|--------------|
|  2 |           US |           UK |            US |           PK |
|  3 |           US |           UK |            PK |          IND |
|  4 |            A |            B |             C |            D |
|  5 |            A |            B |             C |            A |
|  6 |            A |            B |             A |            D |
|  7 |            A |            A |             C |            D |
|  8 |            A |            B |             C |            B |
|  9 |            A |            B |             B |            D |
| 10 |            A |            B |             C |            C |
| ID | COUNTRYCODER | COUNTRYCODEB | COUNTRYCODEBR | COUNTRYCODEF |
|----|--------------|--------------|---------------|--------------|
|  2 |           US |           UK |            US |           PK |
|  3 |           US |           UK |            PK |          IND |
|  4 |            A |            B |             C |            D |
|  5 |            A |            B |             C |            A |
|  6 |            A |            B |             A |            D |
|  7 |            A |            A |             C |            D |
|  8 |            A |            B |             C |            B |
|  9 |            A |            B |             B |            D |
| 10 |            A |            B |             C |            C |
您还可以使用多个
CASE
语句:

SELECT *
FROM   table_name
WHERE  CASE
       WHEN CountryCodeR IN ( CountryCodeB, CountryCodeBR, CountryCodeF )
       THEN 1 ELSE 0
       END
       +
       CASE
       WHEN CountryCodeB IN ( CountryCodeBR, CountryCodeF )
       THEN 1 ELSE 0
       END
       +
       CASE
       WHEN CountryCodeBR IN ( CountryCodeF )
       THEN 1 ELSE 0
       END
       <= 1

这在MySQL中也有效-

请选择这是MySQL还是oracleTim,我不知道你做了什么,但你的编辑比我的编辑(回滚)更糟糕。请阅读并执行并点击谷歌“stackexchange作业”。我不知道这是否是作业,它看起来像一个unpivot,后面是一个分组have,后面是一个pivot,对我来说,这可能有点超出了家庭作业的范围!这种问题是设计拙劣的表现。如果是我,我可能有3列:组id、国家代码、类型。如果列顺序在您的示例中很重要,那么我会有第四列,它可能是代理主键。请选择这是mysql还是oracleTim,我不知道您做了什么,但您的编辑比我的编辑(回滚)更糟。请阅读并执行,然后点击谷歌的“stackexchange作业”。我不知道这是否是作业,对我来说,这看起来像是一个未完成的部分,后面是一个分组的部分,后面是一个支点——这可能有点超出了家庭作业的范围!这种问题是设计拙劣的表现。如果是我,我可能有3列:组id、国家代码、类型。如果列顺序在您的示例中很重要,那么我将有第四列,它可能是代理主键。