SQL тщательно продуманный запрос соединений

У Вас не может быть этого обсуждения, не поднимая системы типов.

основные функции функционального программирования включают функции как первоклассные значения, приправляющие карри, неизменные значения, и т.д. Для меня не кажется очевидным, что шаблоны разработки OO приближают любую из тех функций.

Поэтому эти функции не решают те же проблемы, которые ООП делает..., они - альтернативы императивному программированию. Ответ FP на ООП заключается в системах типов ML, и Haskell... конкретно суммируют типы, абстрактные типы данных, модули ML, Haskell typeclasses.

, Но конечно существуют все еще шаблоны разработки, которые не решены языками FP. Что FP эквивалентен из одиночного элемента? (Игнорирующий на мгновение, что одиночные элементы обычно являются ужасным шаблоном для использования)

первая вещь typeclasses делает, избавляют от необходимости одиночные элементы.

Вы могли пройти список 23 и устранить больше, но у меня нет времени к прямо сейчас.

5
задан Praesidium 22 July 2009 в 13:41
поделиться

9 ответов

Это решение работает, как предписано, спасибо за ввод.

WITH Atts AS 
(
    SELECT
    DISTINCT
        at1.[Attribute]
    FROM
        Attribute at1
    WHERE
        at1.[Asset] = 'Asset-A'
)

SELECT 
    DISTINCT
    Asset,
    (
        SELECT 
            COUNT(ta2.[Attribute]) 
        FROM 
            Attribute ta2 
        INNER JOIN
            Atts b 
            ON
                b.[Attribute] = ta2.[attribute]
        WHERE 
            ta2.[Asset] = ta.Asset
    ) 
    AS [Count]
FROM 
    Atts a
INNER JOIN
    Attribute ta
    ON
    a.[Attribute] = ta.[Attribute]
0
ответ дан 15 December 2019 в 01:08
поделиться
SELECT  ato.id, ato.value
FROM    (
        SELECT  id
        FROM    assets a
        WHERE   NOT EXISTS
                (
                SELECT  NULL
                FROM    attributes ata
                LEFT  JOIN
                        attributes ato
                ON      ato.id = ata.id
                        AND ato.value = ata.value
                WHERE   ata.id = 1
                        AND ato.id IS NULL
                )
        ) ao
JOIN    attributes ato
ON      ato.id = ao.id
JOIN    attributes ata
ON      ata.id = 1
        AND ata.value = ato.value

или в SQL Server 2005 (с образцами данных для проверки):

WITH    assets AS 
        (
        SELECT 1 AS id, 'A' AS name
        UNION ALL
        SELECT 2 AS id, 'B' AS name
        UNION ALL
        SELECT 3 AS id, 'C' AS name
        UNION ALL
        SELECT 4 AS id, 'D' AS name
        ),
        attributes AS
        (
        SELECT 1 AS id, 'Red' AS value
        UNION ALL
        SELECT 1 AS id, 'Hard' AS value
        UNION ALL
        SELECT 2 AS id, 'Red' AS value
        UNION ALL
        SELECT 2 AS id, 'Hard' AS value
        UNION ALL
        SELECT 2 AS id, 'Heavy' AS value
        UNION ALL
        SELECT 3 AS id, 'Blue' AS value
        UNION ALL
        SELECT 3 AS id, 'Hard' AS value
        )
SELECT  ato.id, ato.value
FROM    (
        SELECT  id
        FROM    assets a
        WHERE   a.id <> 1
                AND NOT EXISTS
                (
                SELECT  ata.value
                FROM    attributes ata
                WHERE   ata.id = 1
                EXCEPT
                SELECT  ato.value
                FROM    attributes ato
                WHERE   ato.id = a.id
                )
        ) ao
JOIN    attributes ato
ON      ato.id = ao.id
JOIN    attributes ata
ON      ata.id = 1
        AND ata.value = ato.value
4
ответ дан 15 December 2019 в 01:08
поделиться

Я не совсем понимаю первую часть вашего вопроса, определение ресурсов на основе их атрибутов.

Делая некоторые предположения относительно имен столбцов, следующие запрос даст общие атрибуты между активом-A и активом-B:

SELECT [Table 2].Name
FROM [Table 2]
JOIN [Table 1] a ON a.ID = [Table 2].AssetID AND a.Name = 'Asset-A'
JOIN [Table 1] b ON b.ID = [Table 2].AssetID AND b.Name = 'Asset-B'
GROUP BY [Table 2].Name
0
ответ дан 15 December 2019 в 01:08
поделиться
 Select * From Assets A
    Where Exists 
      (Select * From Assets
       Where AssetId <> A.AssetID
          And (Select Count(*)
               From Attributes At1 Join Attributes At2
                  On At1.AssetId <> At2.AssetId
                      And At1.attribute <> At2.Attribute
               Where At1.AssetId = A.AssetId Asset) = 0 )
    And AssetId = 'Asset-A'
0
ответ дан 15 December 2019 в 01:08
поделиться
select at2.asset, count(*)
from       attribute at1
inner join attribute at2 on at1.value = at2.value
where at1.asset =  "Asset-A"
and   at2.asset != "Asset-A"
group by at2.asset
having count(*) = (select count(*) from attribute where asset = "Asset-A");
0
ответ дан 15 December 2019 в 01:08
поделиться

Найдите все активы, у которых есть все атрибуты, которые есть у "A" (но также могут быть дополнительные атрибуты):

SELECT Other.ID
FROM Assets Other
WHERE
  Other.AssetID <> 'Asset-A'   -- do not return Asset A as a match to itself
  AND NOT EXISTS (SELECT NULL FROM Attributes AttA WHERE
    AttA.AssetID='Asset-A' 
    AND NOT EXISTS (SELECT NULL FROM Attributes AttOther WHERE
      AttOther.AssetID=Other.ID AND AttOther.AttributeID = AttA.AttributeID
      )
    ) 

То есть, "найти любой актив, у которого нет атрибута A, который не также атрибут этого актива ».

Найти все активы, которые имеют точно такие же атрибуты, как« A »:

SELECT Other.ID
FROM Assets Other
WHERE
  Other.AssetID <> 'Asset-A'   -- do not return Asset A as a match to itself
  AND NOT EXISTS (SELECT NULL FROM Attributes AttA WHERE
    AttA.AssetID='Asset-A' 
    AND NOT EXISTS (SELECT NULL FROM Attributes AttOther WHERE
      AttOther.AssetID=Other.ID 
      AND AttOther.AttributeID = AttA.AttributeID
      )
    ) 
  AND NOT EXISTS (SELECT NULL FROM Attributes AttaOther WHERE
    AttaOther.AssetID=Other.ID 
    AND NOT EXISTS (SELECT NULL FROM Attributes AttaA WHERE
      AttaA.AssetID='Asset-A' 
      AND AttaA.AttributeID = AttaOther.AttributeID
      )
   )

Т.е.« найти любой актив, у которого нет атрибута A, который также не является атрибутом этого актива , и если у этого актива нет атрибута, который также не является атрибутом A. "

0
ответ дан 15 December 2019 в 01:08
поделиться

Я подумал, может быть, я смогу сделать это с помощью LINQ, а затем работать по-своему наоборот:

var result = from productsNotA in DevProducts
             where  productsNotA.Product != "A" && 
            (
                from productsA in DevProducts
                where productsA.Product == "A"
                select productsA.Attribute
            ).Except
            (
                from productOther in DevProducts
                where productOther.Product == productsNotA.Product
                select productOther.Attribute
            ).Single() == null
            select new {productsNotA.Product};

result.Distinct()

Я думал, что перевод этого обратно в SQL с помощью LinqPad приведет к красивому SQL-запросу. Однако этого не произошло :). DevProducts - это моя тестовая таблица со столбцами Продукт и Атрибут. Я думал, что в любом случае опубликую LINQ-запрос, он может быть полезен людям, которые играют с LINQ.

Если вы можете оптимизировать LINQ-запрос выше, сообщите мне (это может улучшить SQL;))

0
ответ дан 15 December 2019 в 01:08
поделиться

Найдите все ресурсы, которые имеют те же атрибуты, что и asset-a:

select att2.Asset from attribute att1
inner join attribute att2 on att2.Attribute = att1.Attribute and att1.Asset <> att2.Asset
where att1.Asset = 'Asset-A'
group by att2.Asset, att1.Asset
having COUNT(*) = (select COUNT(*) from attribute where Asset=att1.Asset)
0
ответ дан 15 December 2019 в 01:08
поделиться

Я использую следующий DDL

CREATE TABLE Attributes (
    Asset      VARCHAR(100)
    , Name     VARCHAR(100)
    , UNIQUE(Asset, Name)
    )

Второй вопрос простой

SELECT   Name
FROM     Attributes
WHERE    Name IN (SELECT Name FROM Attributes WHERE Asset = 'A')
         AND Asset = 'B'

Первый вопрос не сложнее

SELECT   Asset
FROM     Attributes
WHERE    Name IN (SELECT Name FROM Attributes WHERE Asset = 'A')
GROUP BY Asset
HAVING   COUNT(*) = (SELECT COUNT(*) FROM FROM Attributes WHERE Asset = 'A')

Изменить:

Я оставил И Актив! = ' A ' из предложения WHERE второго фрагмента для краткости

0
ответ дан 15 December 2019 в 01:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: