Sql 基于交集表以逻辑方式创建模板

Sql 基于交集表以逻辑方式创建模板,sql,oracle,intersection,Sql,Oracle,Intersection,我不知道该如何描述这个问题,但我正试图就关税的代码给出建议。我在甲骨文公司做这件事 以下是我的数据库结构: CODE ( CODEID *PK NCHAR(10) ) CODETARIFF ( TARIFFNO NCHAR(15) *PK *FK CODEID NCHAR(10) *PK *FK ) TARIFF ( TARIFFNO NCHAR(15) *PK ) 因此,我试图在逻辑上为应该分配给关税的代码制作模板。我想象着展示一些大致如下的东西:6关税也

我不知道该如何描述这个问题,但我正试图就关税的代码给出建议。我在甲骨文公司做这件事

以下是我的数据库结构:

CODE (
    CODEID *PK NCHAR(10)
)

CODETARIFF (
    TARIFFNO NCHAR(15) *PK *FK
    CODEID NCHAR(10) *PK *FK
)

TARIFF (
    TARIFFNO NCHAR(15) *PK
)
因此,我试图在逻辑上为应该分配给关税的代码制作模板。我想象着展示一些大致如下的东西:6关税也有这两个与之相关的代码

我尝试了这个方法,但是为每个代码返回的计数并没有真正显示模板,它们只显示了当一个代码与我指定的两个代码同时出现时的发生率

SELECT COUNT(*), CodeID
FROM CodeTariff
  INNER JOIN (
    SELECT TariffNo, COUNT(*) 
    FROM CodeTariff
    WHERE CodeID IN ('ABC', 'DEF') 
    GROUP BY TariffNo
    HAVING COUNT(*) > 1) SQ 
  ON CodeTariff.TariffNo = SQ.TariffNo 
WHERE CodeID NOT IN ('ABC', 'DEF')
GROUP BY CodeTariff.CodeID
ORDER BY COUNT(*) DESC;
抱歉,这让人困惑

我不知道这是否可能,但我正在寻找这样的输出:

数据: 塔里夫码

TariffNo        CodeID

1111            ABC
1111            DEF
2222            ABC
2222            DEF
2222            GHI
2222            JKL
3333            ABC
3333            DEF
3333            GHI
3333            JKL
输出:当给定关税1111时

CodesToAdd      Count

GHI, JKL        2
以便我可以显示:

2其他关税的代码为GHI和JKL。您想将这些代码添加到关税1111吗?

试试这些魔法:

SELECT     Code, COUNT(*) AS Count
FROM         (SELECT     dbo.TariffCode.Tariff, dbo.TariffCode.Code
                   FROM          dbo.TariffCode LEFT OUTER JOIN
                                              (SELECT     TariffCode_2.Tariff, TariffCode_2.Code
                                                FROM          dbo.TariffCode AS TariffCode_2 INNER JOIN
                                                                           (SELECT     Tariff, Code
                                                                             FROM          dbo.TariffCode AS TariffCode_1
                                                                             WHERE      (Tariff = '1111')) AS TariffsWithSharedCodes ON TariffCode_2.Code = TariffsWithSharedCodes.Code AND 
                                                                       TariffCode_2.Tariff <> '1111') AS MutualCodes ON dbo.TariffCode.Tariff = MutualCodes.Tariff AND 
                                          dbo.TariffCode.Code = MutualCodes.Code
                   WHERE      (MutualCodes.Code IS NULL) AND (dbo.TariffCode.Tariff <> '1111')) AS MissingCodes
GROUP BY Code
ORDER BY Count DESC, Code

很抱歉,这是T-SQL,但您会明白的

希望下面的脚本可以帮助您。它将获得所有可能的关税,不仅仅是“1111”:

with temp as (
  select tariffno, tariffno2, codeid 
  from (
    select distinct c1.tariffno, c2.tariffno as tariffno2, c2.codeid
    from tariffcode c1
    join tariffcode c2 on c1.tariffno != c2.tariffno and c1.codeid != c2.codeid 
  ) c1 
  where 
    not exists (select 1 from tariffcode where tariffno = c1.tariffno and codeid = c1.codeid)
)
select tariffno, codeid, count(*) as cnt from temp group by tariffno, codeid;

也许一些预期结果的样本数据可以让这一点更清楚?这是正确的吗事件的顺序是:1用户创建一个新的费率;2用户使用一些现有代码“ABC”和“DEF”标记电费;3该应用程序为用户提供了一些关于其他代码的建议,用户可能希望使用这些代码标记电费。这些建议的逻辑是,应用程序会找到既有标记为“ABC”又有“DEF”的现有关税,并查看在这些现有关税中最常见的其他代码。如果这是正确的,那么你的问题在我看来是正确的。对于每个代码,它显示了有多少现有的关税被标记。是的,但没有任何东西表明一定数量的关税被标记了一个或多个代码,没有真正的联系。我想现在的问题是有道理的。我想我明白了。您之所以建议使用“GHI”和“JKL”,并不是因为它们分别用于两个具有“ABC”和“DEF”的关税,而是因为它们两个一起用于两个具有“ABC”和“DEF”的关税?那么,如果关税3333也被标记为MNO,您希望显示什么?