SQL if оператор с двумя таблицами - PullRequest
0 голосов
/ 14 октября 2011

С учетом следующих таблиц:

объекты таблицы

id    Name   rating
1     Megan      9
2     Irina     10
3     Vanessa    7
4     Samantha   9
5     Roxanne    1
6     Sonia      8

таблица свопов

id   swap_proposalid   counterpartyid
1                 4                2
2                 3                2

Каждый хочет десять.Я хотел бы составить список для Ирины возможных обменов, где id 4 и 3 не появляются, потому что предложения уже есть.

output1

id   Name    rating
1     Megan      9
5     Roxanne    1
6     Sonia      8

Спасибо

Ответы [ 3 ]

3 голосов
/ 14 октября 2011

Это должно сработать:

SELECT o.id, o.Name, o.rating 
FROM objects o
LEFT JOIN swap s on o.id = s.swap_proposalid
WHERE s.id IS NULL
AND o.Name != 'Irina'
0 голосов
/ 14 октября 2011

Предполагая, что логика включает в себя идентификацию объектов, ЗА ИСКЛЮЧЕНИЕМ объекта с самым высоким рейтингом, КРОМЕ предложений с самым высоким рейтингом, например (с использованием образца DDL и данных, любезно отправленных @nonnb):

WITH ObjectHighestRated
     AS 
     (      
      SELECT ID
        FROM MyTable 
       WHERE Rating = (
                       SELECT MAX(T.Rating)
                         FROM MyTable T
                      )
     ),
     PropositionsForHighestRated
     AS
     (
      SELECT swap_proposalid AS ID
        FROM SwapTable
       WHERE counterpartyid IN (SELECT ID FROM ObjectHighestRated)
     ), 
     CandidateSwappersForHighestRated
     AS
     (
      SELECT ID
        FROM MyTable 
      EXCEPT 
      SELECT ID
        FROM ObjectHighestRated
      EXCEPT 
      SELECT ID
        FROM PropositionsForHighestRated                    
     )
SELECT * 
  FROM MyTable
 WHERE ID IN (SELECT ID FROM CandidateSwappersForHighestRated);
0 голосов
/ 14 октября 2011

Это работает

SELECT mt2.ID, mt2.Name, mt2.Rating
FROM [MyTable] mt2  -- Other Candidates
   , [MyTable] mt1 -- Candidate / Subject (Irina)
WHERE mt2.ID NOT IN 
  (
    SELECT st.swap_proposalid
    FROM SwapTable st
    WHERE
      st.counterpartyid = mt1.ID
  )
AND mt1.ID <> mt2.ID -- Don't match Irina with Irina
AND mt1.Name = 'Irina' -- Find other swaps for Irina

- Тестовые данные

CREATE TABLE MyTable
(
  ID INT, 
  Name VARCHAR(100),
  Rating INT
)
GO
CREATE TABLE SwapTable
(
  ID INT,
  swap_proposalid INT,
  counterpartyid INT
)
GO

INSERT INTO MyTable VALUES(1     ,'Megan',       9)
INSERT INTO MyTable VALUES(2     ,'Irina',      10)
INSERT INTO MyTable VALUES(3     ,'Vanessa',    7)
INSERT INTO MyTable VALUES(4     ,'Samantha',   9)
INSERT INTO MyTable VALUES(5     ,'Roxanne',    1)
INSERT INTO MyTable VALUES(6     ,'Sonia',      8)

INSERT INTO SwapTable(ID, swap_proposalid, counterpartyid)
VALUES (1, 4, 2)
INSERT INTO SwapTable(ID, swap_proposalid, counterpartyid)
VALUES (1, 3, 2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...