代码之家  ›  专栏  ›  技术社区  ›  uzay95

如何在SQL Server中多次检索行?

  •  2
  • uzay95  · 技术社区  · 16 年前

    这些是我最初检索到的行:

    112   Cem   Ceminay
    210   Ali   Salih
    132   Gül   Sen
    

    现在我想把每一行复制成3行。所以新的结果是:

    112   Cem   Ceminay
    112   Cem   Ceminay
    112   Cem   Ceminay
    210   Ali   Salih
    210   Ali   Salih
    210   Ali   Salih
    132   Gül   Sen
    132   Gül   Sen
    132   Gül   Sen
    

    什么类型的select语句可以帮助我?

    示例select语句:

    SELECT id,name,surname FROM people;
    

    谢谢你们这些可爱的人…

    我的疑问是:

                SELECT 
            Faturalar.faturaNo
            ,Klinikler.SAPSirketKodu [COMPANY CODE]
            ,Klinikler.SAPBussinessArea [BUSINESS AREA]
            ,BasilmisFaturalar.basilmisFatura_id [REFERENCE]
            ,BasilmisFaturalar.duzenlemeTarihi [DOCUMENT DATE]
            ,BasilmisFaturalar.duzenlemeTarihi [BASELINE DATE]
            ,Kurumlar.sapKodu [ACCOUNT]
            ,Kurumlar.kurumAdi + ' adına '+Faturalar.faturaNo+' nolu fatura' [TEXT]
            ,BasilmisFaturalar.kdvDahilToplamTutar [AMOUNT]
            ,BasilmisFaturalar.kdvHaricToplamTutar
            ,(BasilmisFaturalar.kdvDahilToplamTutar-BasilmisFaturalar.kdvHaricToplamTutar) AS kdvTutari
            ,CASE 
            WHEN BasilmisFaturalar.kdvOrani = 0 THEN 'A0'
            WHEN BasilmisFaturalar.kdvOrani = 8 THEN '2H'
            WHEN BasilmisFaturalar.kdvOrani = 18 THEN '3H'
            END [TAX CODE]
            ,Klinikler.profitCenter [COST CENTER/PROFIT CENTER]
            FROM Faturalar 
            -- Fatura yazdırılmış olmalı
            INNER JOIN BasilmisFaturalar ON BasilmisFaturalar.basilmisFatura_id = Faturalar.refBasilmisFatura_id
            -- Yazdırılmış fatura iptal edilmemiş olmalı
            INNER JOIN BasiliFaturaIptalTalepleri ON BasiliFaturaIptalTalepleri.refBasilmisFatura_id <> BasilmisFaturalar.basilmisFatura_id
            -- Fatura Kurum Detaylarından KURUM bilgilerine
            INNER JOIN KurumFaturaDetaylari ON KurumFaturaDetaylari.kurumFaturaDetay_id = BasilmisFaturalar.refKurumFaturaDetay_id
            -- Faturanın kesildiği kurum
            INNER JOIN Kurumlar ON Kurumlar.kurum_id = dbo.KurumFaturaDetaylari.refKurum_id
            -- Seanslar üzerinden Klinik bilgilerine böylece SAPcc, SAPba, ProfitCenter a ulaşıyoruz
            INNER JOIN Seanslar ON Seanslar.refFatura_id = Faturalar.fatura_id
    
            INNER JOIN dbo.Klinikler ON dbo.Klinikler.klinik_id = Seanslar.refKlinik_id
            -- Belirli bir düzenleme tarihi aralığında olmalı
            WHERE BasilmisFaturalar.duzenlemeTarihi BETWEEN DATEADD(m,-1,GETDATE()) AND GETDATE() 
            GROUP BY Faturalar.faturaNo,BasilmisFaturalar.basilmisFatura_id,kdvDahilToplamTutar
            ,kdvHaricToplamTutar
            ,BasilmisFaturalar.kdvOrani
            ,BasilmisFaturalar.duzenlemeTarihi
            ,Kurumlar.sapKodu
            ,Klinikler.SAPBussinessArea
            ,Klinikler.SAPSirketKodu
            ,Klinikler.profitCenter
            ,Kurumlar.kurumAdi
    
    2 回复  |  直到 13 年前
        1
  •  13
  •   gbn    16 年前

    为了帮助解释: Cartesian product/cross join 背景

    SELECT
        people.id, people.name, people.surname
    FROM
        people
        CROSS JOIN
        (SELECT 1 AS foo UNION ALL SELECT 2 UNION ALL SELECT 3) bar;
    

    在其他地方评论了7张表格和42行之后

    SELECT
        Singles.*
    FROM
        (
        SELECT 
        Faturalar.faturaNo
        ,Klinikler.SAPSirketKodu [COMPANY CODE]
        ,Klinikler.SAPBussinessArea [BUSINESS AREA]
        ,BasilmisFaturalar.basilmisFatura_id [REFERENCE]
        ,BasilmisFaturalar.duzenlemeTarihi [DOCUMENT DATE]
        ,BasilmisFaturalar.duzenlemeTarihi [BASELINE DATE]
        ,Kurumlar.sapKodu [ACCOUNT]
        ,Kurumlar.kurumAdi + ' adına '+Faturalar.faturaNo+' nolu fatura' [TEXT]
        ,BasilmisFaturalar.kdvDahilToplamTutar [AMOUNT]
        ,BasilmisFaturalar.kdvHaricToplamTutar
        ,(BasilmisFaturalar.kdvDahilToplamTutar-BasilmisFaturalar.kdvHaricToplamTutar) AS kdvTutari
        ,CASE 
        WHEN BasilmisFaturalar.kdvOrani = 0 THEN 'A0'
        WHEN BasilmisFaturalar.kdvOrani = 8 THEN '2H'
        WHEN BasilmisFaturalar.kdvOrani = 18 THEN '3H'
        END [TAX CODE]
        ,Klinikler.profitCenter [COST CENTER/PROFIT CENTER]
        FROM Faturalar 
        -- Fatura yazdırılmış olmalı
        INNER JOIN BasilmisFaturalar ON BasilmisFaturalar.basilmisFatura_id = Faturalar.refBasilmisFatura_id
        -- Yazdırılmış fatura iptal edilmemiş olmalı
        INNER JOIN BasiliFaturaIptalTalepleri ON BasiliFaturaIptalTalepleri.refBasilmisFatura_id <> BasilmisFaturalar.basilmisFatura_id
        -- Fatura Kurum Detaylarından KURUM bilgilerine
        INNER JOIN KurumFaturaDetaylari ON KurumFaturaDetaylari.kurumFaturaDetay_id = BasilmisFaturalar.refKurumFaturaDetay_id
        -- Faturanın kesildiği kurum
        INNER JOIN Kurumlar ON Kurumlar.kurum_id = dbo.KurumFaturaDetaylari.refKurum_id
        -- Seanslar üzerinden Klinik bilgilerine böylece SAPcc, SAPba, ProfitCenter a ulaşıyoruz
        INNER JOIN Seanslar ON Seanslar.refFatura_id = Faturalar.fatura_id
    
        INNER JOIN dbo.Klinikler ON dbo.Klinikler.klinik_id = Seanslar.refKlinik_id
        -- Belirli bir düzenleme tarihi aralığında olmalı
        WHERE BasilmisFaturalar.duzenlemeTarihi BETWEEN DATEADD(m,-1,GETDATE()) AND GETDATE() 
        GROUP BY Faturalar.faturaNo,BasilmisFaturalar.basilmisFatura_id,kdvDahilToplamTutar
        ,kdvHaricToplamTutar
        ,BasilmisFaturalar.kdvOrani
        ,BasilmisFaturalar.duzenlemeTarihi
        ,Kurumlar.sapKodu
        ,Klinikler.SAPBussinessArea
        ,Klinikler.SAPSirketKodu
        ,Klinikler.profitCenter
        ,Kurumlar.kurumAdi
        ) Singles
        CROSS JOIN
        (SELECT 1 AS foo UNION ALL SELECT 2 UNION ALL SELECT 3) Multiplier;
    
        2
  •  7
  •   marc_s    16 年前

    怎么样:

    SELECT id,name,surname FROM people
    UNION ALL
    SELECT id,name,surname FROM people
    UNION ALL
    SELECT id,name,surname FROM people
    

    并可能添加

    ORDER BY id, name
    

    如果你想订购的话。

    马克