SQL Query,如何从表中获取数据,但仅限于在另一个表中插入数据时

时间:2012-09-14 18:15:03

标签: sql join foreign-keys

好吧,我不知道怎么在标题上解释这个,所以我会更清楚。

我有几张桌子:

TiposDeCatalogo:

PK IdTipoCatalogo (int) 
IdVendedor (int)
Nombre (string)
Descripcion (string)
Estado (string)
FechaAlta (date)

Catalogo: 

PK IdCatalogo (int) 
IdTipoCatalogo (int)
IdVendedor (int)
Nombre (string)
Descripcion (string)
Estado (string)
FechaAlta (date)

Catalogo上有一个外键.IdTipoCatalogo = TiposDeCatalogos.IdTipoCatalogo

我需要一个查询,可以显示已在Catalogo上注册的TiposDeCatalogo上的所有行

例如......

TiposDeCatalogos有以下行

IdTipoCatalogo IdVendedor Nombre Estado FechaAlta

1   1   Catalogos de Ventas     Activo  20/08/2012
2   1   Catalogos de CRM        Activo  20/08/2012
3   1   Catalogos de Inventario     Activo  20/08/2012
4   1   Catalogos de Facturacion        Activo  04/09/2012
5   1   Catalogos de Cobranza       Activo  04/09/2012
6   1   Catalogos de Admin      Activo  04/09/2012
7   1   Catalogos de Admin      Activo  04/09/2012
8   1   Catalogos de Finanzas       Activo  04/09/2012
9   1   Catalogos de Clientes       Activo  04/09/2012
12  1   Catalogos de Administ General       Activo  04/09/2012

然后Catalogo有以下行

IdCatalogo IdTipoCatalogo IdVendedor Nombre Estado FechaAlta

1   1   17  Formas de Pago  formas de pago para las ventas  Activo  01/09/2012
2   5   1   Tipos de Moneda     Activo  05/09/2012
3   2   1    Tipos de Agendamiento      Activo  05/09/2012
4   3   1   Tipos de Precios        Activo  06/09/2012
5   5   1    TIpos de Moneda        Activo  06/09/2012
6   3   1   Tipo de Presentacion        Activo  06/09/2012

您可能会注意到在Catalogo中,只有以下IdTipoCatalogo已注册(1,2,3,5)

所以我想要的是一个向我展示那些TiposDeCatalogos的查询(每个只有一次,所以在这个例子中查询应该只返回4行)....

我希望你能帮助我,谢谢

1 个答案:

答案 0 :(得分:4)

您可以使用EXISTS来完成此操作:

SELECT
    tc.IdTipoCatalogo,
    tc.IdVendedor,
    tc.Nombre,
    tc.Estado,
    tc.FechaAlta
FROM TiposDeCatalogos tc
WHERE EXISTS (
    SELECT 1
    FROM Catalogo c 
    WHERE c.IdTipoCatalogo = tc.IdTipoCatalogo 
)

或者,您可以使用JOINDISTINCT

SELECT DISTINCT
    tc.IdTipoCatalogo,
    tc.IdVendedor,
    tc.Nombre,
    tc.Estado,
    tc.FechaAlta
FROM 
    TiposDeCatalogos tc
    JOIN Catalogo c ON c.IdTipoCatalogo = tc.IdTipoCatalogo 

但是,效率可能会降低,因为DISTINCT将需要额外的操作来排除JOIN生成的重复项。